Spring IOC控制反转

三、控制反转

通过设置一个第三方的容器,让ABCD解耦,他们之间就不会因为某一个奔溃导致全部不能使用,他们实现了独立;

控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。

简单一点来说就是把这个程序的主动权进行一个移交;原来的程序,用户获得的对象是由程序员的class a=new class();来构成,如果用户需求改变那么对象就要改变但是如果使用setter注入的话,就不会存在这个问题;用户需要什么就自己选择,程序员也避免了大量的代码修改工作;

四、IOC创建对象的三种方式(构造器注入)

默认使用的是无参构造器但是当有参构造器存在时,无参构造器便没有用

1.第一种:下标

属性是对象:

构造器:

public UserServiceImpl (UserDao userdao) {
        this.userDao=userdao;
    }
<bean id="UserServiceImpl" class="com.saxon.Service.UserServiceImpl">
        <property name="userDao" ref="OralceUserImpl"/>
        <constructor-arg index="0" ref="OralceUserImpl"/>
    </bean>

属性不是对象:

构造器:

public UserServiceImpl (int a) {
        System.out.println (a);
    }
<bean id="UserServiceImpl" class="com.saxon.Service.UserServiceImpl">
        <property name="userDao" ref="OralceUserImpl"/>
        <constructor-arg index="0" value="0"/>
</bean>

index指的是构造器属性的下标,如果不是对象就用value直接赋值;

2.第二种:根据属性的类型(不推荐)

public UserServiceImpl (int a,String b) {
        System.out.println (a+"&"+b);
}
<bean id="UserServiceImpl" class="com.saxon.Service.UserServiceImpl">
        <property name="userDao" ref="OralceUserImpl"/>
        <constructor-arg type="int" value="0"/>
        <constructor-arg type="java.lang.String" value="1"/>
    </bean>
<bean id="UserServiceImpl" class="com.saxon.Service.UserServiceImpl">
        <property name="userDao" ref="OralceUserImpl"/>
        <constructor-arg type="com.saxon.Dao.UserDao" ref="OralceUserImpl"/>
</bean>

当存在多个相同数据的时候赋值根据你的语句顺序来赋值;

不推荐原因:当我们的类名过于复杂的时候,就很容易把类名写错;当存在多个参数名一样,但是类名不一样的重载,无法确定使用那个

3.第三种:根据属性的名字

public UserServiceImpl (UserDao userDao) {
        this.userDao = userDao;
    }

 <bean id="UserServiceImpl" class="com.saxon.Service.UserServiceImpl">
        <property name="userDao" ref="OralceUserImpl"/>
        <constructor-arg name="userDao" ref="OralceUserImpl"/>
</bean>

是对象就用ref,不是对象直接用value;

我们所有的bean在注册的时候,就全部被实例化过了,所以我们直接取过来就可以使用,所以他只会实例化一个对象,不会再new一个,下面运行的结果是true

ApplicationContext context = new ClassPathXmlApplicationContext ("applicationContent.xml");
UserServiceImpl userServiceImpl = (UserServiceImpl)context.getBean ("UserServiceImpl");
UserServiceImpl userServiceImp2 = (UserServiceImpl)context.getBean ("UserServiceImpl");
System.out.println (userServiceImpl==userServiceImp2);

ApplicationContext就是一个容器,你需要啥就拿啥;

自学总结
学习地址:狂神说Java

posted @ 2020-08-15 18:47  SaxonMo  阅读(114)  评论(0编辑  收藏  举报