DI和IoC

来源:互联网 发布:金蝶软件购买 编辑:程序博客网 时间:2024/06/08 19:27

1、依赖注入(Dependency Injection)

public class A{    public void initMethod(){        B b = ...;// get a instance of B        b.func();    }}

如示例代码,组件A中要使用组件B,必须先获取B的一个实例;若B是一个具体的类,只需通过new关键字创建B的实例;若B是一个接口,有多个实现,那么具体采用B的哪一个实现就不确定了。

依赖注入因此而生:接管对象的创建工作,将特定的对象饮用注入到需要改对象的组件。

2、依赖注入的方式

1)Set方法注入

public class A{    private B b;    public void initMethod(){        b.func();    }    public void setB(B b){        this.b = b;    }}

2)构造器注入

public class A{    private B b;    public A(){        this.b = b;    }    public void initMethod(){        b.func();    }}

3、Spring注入方式

1)构造器注入(constructor-arg)

<bean id="car" class="cn.demo.Car">    <!--        index:参数顺序        type:参数类型        name:参数名称        value:参数值        ref:引用的bean的id    -->    <constructor-arg index="0" type="java.lang.String" value="宝马"/></bean>

2)setter方法注入(property)

<bean id="car" class="cn.demo.Car">    <!--        name:参数名        value:参数值        ref:引用bean的id    -->    <property name="sid" value="10001"/>    <property name="sname" value="张三"/>    <property name="bike" ref="bike"/></bean>

3)@Autowired

public class A{    @Autowired    private B b;    public void initMethod(){        b.func();    }}

4、控制反转(Inverse of Control)
IoC:解决程序对象紧密耦合的问题,将程序构造对象的权限,交给IoC容器。

IoC容器装配Bean(XML配置)

1)无参构造器

<!--    id:bean的id    name:bean的名称    class:bean的类名    init-method:对象构造后执行的方法    destroy-method:容器销毁后执行的方法,默认不执行,必须手动调用applicationContext.close();--><bean id="person" class="cn.demo.Person" init-method="setup" destroy-method="teardown"/>

2)工厂方法

<bean id="person" class="cn.demo.Person" factory-method="getInstance" />

5、Spring的核心工厂

BeanFactory和子接口ApplicationContext,getBean方法执行时,实例化一个Bean。

ApplicationContext context = new ClassPathApplicationContext(new String[]{"spring-config.xml"});Person person = context.getBean("person", Person.class);

6、其他注解
@PostConstruct:初始化之后执行的方法,同init-method
@PreDestroy:销毁之前执行的方法,同destroy-method
@Scope:指定bean的作用域
@Resource:作用同@Autowired,区别

7、Bean的作用域

  • singleton
    在IoC容器中仅存在一个Bean,Bean以单例模式存在。
  • prototype
    每次从容器getBean时,都返回一个新的Bean,即new XXX();
  • request
    每次Http请求都会创建一个Bean,仅适用于WebApplicationContext环境。
  • session
    同一个HttpSession共享一个Bean,不同session使用不同的Bean,仅适用于WebApplicationContext环境。
  • globalSession
    一般用于Porlet应用环境,适用于WebApplicationContext环境。