定义/作用

当我们要使用第三方类实现组件注册到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容器中移除时触发该方法。销毁方法也不能带有参数。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐