spring是一个轻量级的框架,以 IoC(控制反转)和 AOP(面向切面编程)为内核。其实DI(依赖注入)是IoC的实现方法
一、IOC
1、概念
Spring中的对象都是由IOC容器进行管理,不需要通过new来创建对象,他通过XML文件或者注解来实例化对象
BeanFactory容器
BeanFactory是IOC容器之一,是管理Bean的工厂,它主要用于初始化Bean
Resource resource = new ClassPathResource("applicationContext.xml");
BeanFactory factory = new XmlBeanFactory(resource);
ApplicationContext容器
ApplicationContext继承BeanFactory,在BeanFactory基础上增加了一些功能,例如AOP、国际化、实践支持等。
ApplicationContext有两个常用的实现类
- ClassPathXmlApplicationContext:该类从xml文件中加载已经被定义的bean,需要提供完整的xml文件路径
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(String configLocation);
- FileSystemXmlApplicationContext:该类从xml文件中加载已经被定义的bean,不需要提供完整路径,只需正确配置 CLASSPATH 环境变量即可。
ApplicationContext applicationContext = new FileSystemXmlApplicationContext(String configLocation);
两个容器的区别:
1、如果我们的bean存在问题,例如某个属性没有注入,那么ApplicationContext会立马报错,有利于我们检查错误,而BeanFactory会启动报错
2、ApplicationContext加载bean是一次性全部初始化,而Beanfactory是用到的时候再初始化
3、由于ApplicationContext一次性全部初始化,所以在启动是时候会慢一些,但是对于后期的使用则没有任何性能影响
2、依赖注入
Spring容器将被依赖对象赋值给被调用者的成员变量,相当于为调用者注入了他所依赖的实例
如案例所示:
实体类如下:
public class User {
private String userId;
private String userName;
public User(){
}
public User(String userId,String userName){
this.userId = userId;
this.userName = userName;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
构造注入(实体类必须要有构造函数)
xml文件如下:
<!--id相当于我们new出来的对象,class对应的实体类-->
<bean id="user" class="com.qwe.pojo.User">
<!--name:属性名,value:赋值-->
<constructor-arg name="userId" value="1001"/>
<constructor-arg name="userName" value="张三"/>
</bean>
setter方法注入(实体类必须有set方法)
xml文件配置如下:
<!--id相当于我们new出来的对象,class对应的实体类-->
<bean id="user" class="com.qwe.pojo.User">
<!--name:属性名,value:赋值-->
<property name="userId" value="1001"/>
<property name="userName" value="张三"/>
</bean>
p命名空间注入
<bean id="user" class="com.qwe.pojo.User" p:userId="1001" p:userName="张三"/>
c命名空间注入
<bean id="user" class="com.qwe.pojo.User" c:userId="1001" c:userName="张三"/>