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 集合类型属性注入(了解)
<bean id="collectionBean" class="com.itheima.spring.demo5.CollectionBean">
<property name="arrs">
<list>
<value>王东
</value>
<value>赵洪
</value>
<value>李冠希
</value>
</list>
</property>
<property name="list">
<list>
<value>李兵
</value>
<value>赵如何
</value>
<value>邓凤
</value>
</list>
</property>
<property name="set">
<set>
<value>aaa
</value>
<value>bbb
</value>
<value>ccc
</value>
</set>
</property>
<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:指定销毁时的方法