####这个是我自己的理解 不对 请告诉我
我个人认为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);
第五种 静态工厂、动态工厂生产对象