IoC和DI实现

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的哪一个实现就不确定了。

依赖注入:接管对象的创建工作,将特定对象的引用注入到需要该对象的组件中。

1、 Java代码方式

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(B b){
        this.b = b;
    }

    public void initMethod(){
        b.func();
    }
}

2、XML配置

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、注解
1)@Autowired,默认ByType

public class A{
    @Autowired
    private B b;

    public void initMethod(){
        b.func();
    }
}

2)@Resource,默认ByName

public class A{
    @Resource
    private B b;

    public void initMethod(){
        b.func();
    }
}

2、IoC装配Bean

概念:解决程序对象耦合的问题,将程序构造对象的权限交给IoC容器。

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" />

3、Spring的核心工厂

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

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

4、其他注解

@PostConstruct:初始化之后执行的方法,同init-method
@PreDestroy:销毁之前执行的方法,同destroy-method
@Scope:指定bean的作用域

5、Bean的作用域

  • singleton
    在IoC容器中仅存在一个Bean,Bean以单例模式存在。
  • prototype
    每次从容器getBean时,都返回一个新的Bean,即new XXX();
  • request
    每次Http请求都会创建一个Bean,仅适用于WebApplicationContext环境。
  • session
    同一个HttpSession共享一个Bean,不同session使用不同的Bean,仅适用于WebApplicationContext环境。
  • globalSession
    一般用于Porlet应用环境,适用于WebApplicationContext环境。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值