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:指定销毁时的方法