【Spring】控制反转IOC与依赖注入DI的简单理解及实现

控制反转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();
    }
}

显然,注解的方式,代码更简洁

原创文章 255 获赞 116 访问量 19万+

猜你喜欢

转载自blog.csdn.net/cxh6863/article/details/104818855