Spring中的IOC与DI

    xiaoxiao2025-08-02  16

    IOC:控制反转,将对象的创建权反转给了Spring。 DI:依赖注入,前提必须有IOC的环境,Spring管理这个类的时候将类的依赖的属性注入(设置)进来。

    一、DI(依赖注入)

    1.1 Spring的属性注入

    1.1.1 构造方法的方式的属性注入(开发常用)

    1.1.2 Set方法的方式的属性注入

    Set方法的属性注入

    Set方法设置对象类型的属性

    1.1.3 P名称空间的属性注入(Spring2.5以后)

    通过引入p名称空间完成属性的注入:

    写法: 普通属性 p:属性名=”值” 对象属性 p:属性名-ref=”值”

    P名称空间的引入

    使用p名称空间

    1.1.4 SpEL的属性注入(Spring3.0以后)

    SpEL:Spring Expression Language,Spring的表达式语言。语法:#{SpEL}

    1.2 集合类型属性注入(了解)

    <!-- Spring的集合属性的注入============================ --> <!-- 注入数组类型 --> <bean id="collectionBean" class="com.itheima.spring.demo5.CollectionBean"> <!-- 数组类型 --> <property name="arrs"> <list> <value>王东</value> <value>赵洪</value> <value>李冠希</value> </list> </property> <!-- 注入list集合 --> <property name="list"> <list> <value>李兵</value> <value>赵如何</value> <value>邓凤</value> </list> </property> <!-- 注入set集合 --> <property name="set"> <set> <value>aaa</value> <value>bbb</value> <value>ccc</value> </set> </property> <!-- 注入Map集合 --> <property name="map"> <map> <entry key="aaa" value="111"/> <entry key="bbb" value="222"/> <entry key="ccc" value="333"/> </map> </property> </bean>

    二、IOC(控制反转)

    2.1 XML版

    Xml版用的是setter注入方式

    2.1.1Bean的相关配置

    2.1.1.1标签的id和name的配置
    id :使用了约束中的唯一约束。里面不能出现特殊字符的。name :没有使用约束中的唯一约束(理论上可以出现重复的,但是实际开发不能出现的)。里面可以出现特殊字符。Spring和Struts1框架整合的时候 <bean name=”/user” class=””/>
    2.1.1.2 Bean的生命周期的配置(了解)
    init-method :Bean被初始化的时候执行的方法destroy-method :Bean被销毁的时候执行的方法(Bean是单例创建,工厂关闭)
    2.1.1.3 Bean的作用范围的配置(重点)
    scope :Bean的作用范围singleton :默认的,Spring会采用单例模式创建这个对象。prototype :多例模式。(Struts2和Spring整合一定会用到)request :应用在web项目中,Spring创建这个类以后,将这个类存入到request范围中。session :应用在web项目中,Spring创建这个类以后,将这个类存入到session范围中。globalsession :应用在web项目中,必须在porlet环境下使用。但是如果没有这种环境,相对于session

    2.1.2 spring中的Bean管理

    2.1.2.1 Bean实例化的三种方式
    2.1.2.1.1无参构造方法的方式(默认)

    编写类 编写配置

    2.1.2.1.2静态工厂实例化的方式

    编写Bean2的静态工厂

    配置

    2.1.2.1.3实例工厂实例化的方式

    Bean3的实例工厂

    配置

    2.1.3 分模块配置

    2.1.3.1 在加载配置文件的时候,加载多个

    2.1.3.2 在一个配置文件中引入多个配置文件

    2.2 注解版

    注解版用的是构造方法注入

    2.2.1 ApplicationContext.xml的配置

    开启注解和扫描 <!--扫描注入--> <context:annotation-config /> <!--扫描所有类上的注解--> <context:component-scan base-package="com.vp"/> 注意:开启所有类注解就不用配置扫描注入,也可都开启

    2.2.2 类的注解(四种)

    @Component @Service @Controller @Repository(2.5.6目前4个注解无区别)

    @Component: 是一个泛化的概念,仅仅表示一个组件 (Bean) ,可以作用在任何层次。@Repository:用于将数据访问层(DAO层)的类标识为spring中的bean@Service:通常作用在业务层(Service层),但是目前该功能与 @Component 相同。@Constroller 通常作用在控制层(如springMVC的controller),但是目前该功能与 @Component 相同。

    a)初始化的名字默认为类名首字母小写

    2.2.3 注入数据的注解

    2.2.3.1 @Autowired

    用于对Bean的属性变量、属性的setter方法及构造方法进行标注。 自动按照类型注入,当容器中只有唯一一个对象时才能注入成功;当使用该注解时,就不需要set方法了

    注意:当容器中有多个对象时,可以通过名称区别自动注入。如 @Autowired private IAccountDao accountDao1;

    2.2.3.2 @Qualifier

    与@Autowired注解同时使用,当有多个实现类对象时,可以用该注解指定id来注入 该注解也可以单独用在方法参数上

    2.2.3.3 @Value

    作用:用于注入基本类型和String类型的数据 属性: value:用于指定数据的值。它可以使用spring中SpEL(也就是spring的el表达式) SpEL的写法:${表达式}

    2.2.3.4 byType和byName

    @Autowried默认按类型进行注解 a) 默认按类型by type

    public class UserBiz { private UserDao uDao; @Autowired public void setuDao(UserDao uDao) { this.uDao = uDao; } }

    b) 如果想用byName,使用@Qulifier

    <bean id="admin" class="com.demo.dao.impl.UserDao_admin"></bean> <bean id="d" class="com.demo.dao.impl.UserDao_domestic"></bean> <bean id="ubiz" class="com.demo.service.UserBiz" init-method="init" destroy-method="destroy"> </bean> @Autowired public void setuDao(@Qualifier("d") UserDao uDao) { this.uDao = uDao; }

    2.2.4 关于对象作用域的注解

    @Scope

    与xml中的scope属性一样,用来改变对象的作用域 值:singleton、prototype、request、session、global-session

    @Resources 直接按照bean的id注入,可以单独使用,不能在方法参数上使用

    注意:jdk9不能使用该注解

    2.2.5 关于生命周期的注解(了解)

    他们的作用就和在bean标签中使用init-method和destroy-method的作用是一样的 @PostConstruct:指定初始化时的方法 @PreDestroy:指定销毁时的方法

    最新回复(0)