Spring的ioc容器创建对象的方式,依赖注入的几种表现形势

####这个是我自己的理解 不对 请告诉我

我个人认为Spring的依赖注入有三种注入 方式  (setter方法  、构造方法注入、注解注入(反射完成)) 

注解注入的常用注解有三种  @value   @autowired  @resource   

@value是对基本类型注入  

@autowired是对bean进行注入  是通过类型注入  (有时候需要配合@Qualifier注解)

@reource 是对bean的注入是先通过类型注入  然后通过bean名称注入 

 

bean对象被注册在ioc容器中其实有好多种方式 ,我说一下我了解的吧

第一种: 基于XMl的配置   (在这种配置中 ,我们可以不借助如何注解 实现Spring容器对对象的创建)

通过xml配置文件的Bean标签 我们可以实现对Bean对象在spring容器中的注册   (对于通过XML的配置 ,我们可以通过setter注入和构造方法注入 来实现对创建对象的属性注入(依赖注入))

<!--Setter方法注入-->

<bean id="helloService" class="com.xc.service.HelloService">

    <property name="helloDao" ref="helloDao"/>

</bean>

 

 

<!--构造方法注入-->

<bean class="com.xc.controller.HelloController">

    <constructor-arg index="0" ref="helloService"/>

</bean>

 

<!--注解注入 -->

public class HelloDao {

 

 

    @Value("hello world")

    public String name;

}

<!--不需要依赖注入的对象,注解注入了基本类型-->

<bean id="helloDao" class="com.xc.dao.HelloDao"/>

 

第二种基于Java配置类的形势对bean对象进行注册

@Configuration

public class Config1 {

 

 

 

 

        //构造方法注入

    @Bean

    public HelloController helloController()

    {

 

        return new HelloController(helloService());

    }

 

   //setter方法注入   

    <!--java配置类我没找到纯粹的setter注入的方式   但是我们可以通过自动装配的注解来是实现setter注入-->

public class HelloService {

    public HelloDao helloDao;

 

    <!--我们可以通过在setter方法上添加主动装配的注解来实现setter注入 -->

    @Autowired

    public void setHelloDao(HelloDao helloDao) {

        this.helloDao = helloDao;

    }

}

    @Bean

    public HelloDao helloDao(){

        return new HelloDao();

    }

    

 

    @Bean

    public HelloService helloService(){

        return new HelloService();

    }

 

   /个人感觉配置类的注解注入其实和setter注入很相似  其实就是把注入注解加在成员变量上

    

 

第三种: 通过自动扫描和自动装配

自动装配其实和自动装配配合使用  真香 (   配置自动扫描需要和自动装配一起使用,否则你创建的对象成员变量就是null )   

      @value   @autowired  @resource   

xml

<!-- 配置自动扫描  -->

<context:component-scan base-package="com.xc"/>

 

java配置类

@Configuration

@ComponentScan("com.xc")

 

第四种:通过实现FactoryBean接口的对象生产

对于spring也可以通过FactoryBean接口的实现类来创建对象

public class HelloDaoFactoryBean implements FactoryBean {

    @Override

    public Object getObject() throws Exception {

        return new HelloDao();

    }

 

 

    @Override

    public Class<?> getObjectType() {

        return HelloDao.class;

    }

 

 

    @Override

    public boolean isSingleton() {

        return true;

    }

}

 

通过FactoryBean接口实现类创建对象  

  ApplicationContext applicationContext = new AnnotationConfigApplicationContext(Config1.class);

//获取实现FactoryBean类

HelloDaoFactoryBean helloDaoFactoryBean = applicationContext.getBean("&helloDaoFactoryBean", HelloDaoFactoryBean.class);

System.out.println(helloDaoFactoryBean);

 

//获取FactoryBean实现类创建的对象 

HelloDao helloDao = applicationContext.getBean("helloDaoFactoryBean", HelloDao.class);

System.out.println(helloDao);

 

第五种   静态工厂、动态工厂生产对象 

参考CSDN  https://blog.csdn.net/qq_41372133/article/details/89762940?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值