定义/作用
当我们要使用第三方类实现组件注册到IOC容器时,例如第三方数据库连接池等,我们无法修改他们的代码,所以我们不能通过@Component及其衍生注解来进行组件定义。这是,可以通过@Bean注解把第三方组件注册到IOC容器中。
源码:
//能够作用在方法和注解上,作用在方法上和作用在注解上的用处不同,通常作用在方法上。
//作用在注解上时会使得该注解也可以用于注册主键,属于Bean的衍生注解,与@Component类似。
@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Bean {
//设置生成的组件的id,如果不设置时,组件id默认为注解到方法名。
@AliasFor("name")
String[] value() default {};
//与value属性互为别名,作用一样。
@AliasFor("value")
String[] name() default {};
/** @deprecated */
//在spring5.1之后该属性不推荐使用。设置Autowire自动装配时首选的装配方式。
@Deprecated
Autowire autowire() default Autowire.NO;
//该组件能否用@Autowired注解进行自动装配,默认true。
//如果设置为false,则用Autowired注解进行自动装配时会报错。
boolean autowireCandidate() default true;
//指定bean创建的初始化方法
String initMethod() default "";
//指定bean的销毁回调方法。
String destroyMethod() default "(inferred)";
}
使用方式:
@Configuration
public class DaoConfig {
/**
* 使用bean注解生成 DruidDataSource实例并注册到IOC容器中。
* @return
* @throws IOException
*/
@Bean
public DruidDataSource dataSource() throws IOException {
DruidDataSource dataSource = new DruidDataSource();
//加载配置文件,作为数据源的初始化属性
Properties properties = PropertiesLoaderUtils.loadAllProperties("daoconfig/datasource-config.properties");
dataSource.setConnectProperties(properties);
//返回dataSource,spring会把他注册到IOC容器中。
return dataSource;
}
}
/**
*测试代码
*/
public class TestBean {
private AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(DaoConfig.class);
@Test
public void testBean() throws SQLException {
DataSource dataSource = (DataSource) context.getBean("dataSource");
Connection connection = dataSource.getConnection();
System.out.println(connection);
}
}
配置文件:
结果:
从容器中拿到了数据源对象,并成功获取了数据库连接。并且组件名称默认是方法名。
属性详解
boolean autowireCandidate() default true;
该属性设置该组件能否用@Autowired注解进行自动装配,默认true。如果设置为false,则用Autowired注解进行自动装配时会报错。
demo
//新建一个UserDao类,用于注入数据源
@Repository
public class UserDao {
@Autowired
private DataSource dataSource;
public void fun() throws SQLException {
Connection connection = dataSource.getConnection();
System.out.println(connection);
}
}
//测试代码
public class TestBean {
private AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(DaoConfig.class);
@Test
public void testBean() throws SQLException {
UserDao userDao = (UserDao) context.getBean("userDao");
userDao.fun();
}
}
结果:
能正确注入并执行。
把autowireCandidate设置为false
结果:
抛出异常。
Autowire autowire() default Autowire.NO;
在spring5.1之后该属性不推荐使用。设置Autowire自动装配时首选的装配方式。
值是枚举类Autowire
public enum Autowire {
//不设置、也就是不干扰,采用Spring对Autowired自动装配的默认机制进行装配。
NO(0),
//先采用id进行自动装配,如果id不存在就采用类型。
BY_NAME(1),
//先采用类型进行装配。如果类型多于1个导致装配失败时就采用id进行装配。这个是spring对
//Autowired注解的默认装配机制。
BY_TYPE(2);
private final int value;
private Autowire(int value) {
this.value = value;
}
public int value() {
return this.value;
}
public boolean isAutowire() {
return this == BY_NAME || this == BY_TYPE;
}
}
String initMethod() default “”;
设置组件实例化时的初始化方法,会在依赖注入之后执行。属于bean生命周期的其中一个时期。初始化方法不能带有参数。
String destroyMethod() default “(inferred)”;
设置组件实例化时的销毁方法,通常用于释放一些资源,触发时机是IOC容器关闭或者该组件从IOC容器中移除时触发该方法。销毁方法也不能带有参数。