控制反转IOC
它就是将bean的对象交给Sping容器进行管理
主要用的是反射机制(初始化)——创建对象 解析xml demo4J
可以降低耦合度
简单理解呢,就是,我们之前获取一个对象,是通过new来获取的,比如有一个User的类,我们通过UserDao user=new UserDao ()的方式获取,而使用控制反转是直接讲user这个对象放到Spring容器中,然后在需要的时候直接取
1、控制反转的理解
为什么说是控制反转呢?是怎么降低耦合度的呢?
我们借助俩个类来理解下,比如有两个类UserService和类UserDao,我们想在UserService中调用UserDao中的方法,
一种方法就是在UserService中实例化UserDao的一个对象(UserDao userDao=new UserDao()),然后再调用userDao里边的方法(userDao.XXX),这种方式呢,是UserService主动实例化了一个UserDao的对象,可以理解为UserService主动控制了UserDao。
另一种方法呢,就是userDao直接就被spring容器创建好了,当UserService想要用的时候,spring容器把userDao给了UserService,所以就不是UserService主动去创建一个对象了,而是别人给他的,所以就是反转了。
没有在UserService里创建userDao对象,所以也就降低耦合度了。
控制反转的代码体现:
1、在配置文件中(我这里是spring.xml)配置bean,让Spring去创建相应的对象,容器来管理对象
<bean id="userDao" class="cn.cxh.dao.UserDao"></bean>
2、使用ClassPathXmlApplicationContext读取配置文件,获取到对象
ClassPathXmlApplicationContext app=new ClassPathXmlApplicationContext("spring.xml");
UserDao userDao = (UserDao) app.getBean("userDao");
依赖注入DI
依赖注入是解决对象间的依赖关系
是一种IOC的实现方式
依赖注入的方式:
(1)通过构造函数
(2)通过set方法给属性值注入值
(3)p名称空间
(4)注解
我们常用的是注解方式
我这里用了俩种方式,一个是set方法的,一个是注解方式的。个人感觉p名称空间的方式和set方式一样,只是在配置文件中配置时的写法不一样
第一种 set方式
1、在配置文件中配置
<bean id="userDao" class="cn.cxh.dao.UserDao"></bean>
<bean id="userService" class="cn.cxh.service.UserService">
<property name="userDao" ref="userDao"></property>
</bean>
2、生成get,set方法
public class UserService {
private UserDao userDao;
public void add(){
System.out.println("userService add...");
userDao.add();
}
public UserDao getUserDao() {
return userDao;
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
}
3、读取
public class SpringTestDI {
public static void main(String[] args) {
ClassPathXmlApplicationContext app=new ClassPathXmlApplicationContext("spring.xml");
UserService userService= (UserService) app.getBean("userService");
userService.add();
}
}
第二种 注解方式
1、在配置文件中配置
<context:component-scan base-package="cn.cxh"></context:component-scan>
2、添加注解@Repository,@Service, @Autowired
@Repository
public class DeptDao {
public void add(){
System.out.println("deptDao add...");
}
}
@Service
public class DeptService {
@Autowired
private DeptDao deptDao;
public void add(){
System.out.println("deptService add...");
deptDao.add();
}
}
3、读取
public class SpringTestDI {
public static void main(String[] args) {
ClassPathXmlApplicationContext app=new ClassPathXmlApplicationContext("spring.xml");
DeptService deptService= (DeptService) app.getBean("deptService");
deptService.add();
}
}
显然,注解的方式,代码更简洁