@Bean介绍
@Bean用于指示一个方法应该产生一个Bean对象,并将其交给Spring容器管理。
当使用@Bean注解的方法被Spring容器调用时,它只会执行一次,随后该方法返回的Bean对象会被添加到Spring的IOC(Inversion of Control,控制反转)容器中。这个Bean对象通常具有一个默认的id,即方法名,但可以通过@Bean的name属性显式指定Bean的名称。@Bean通常用于@Configuration类中,但也可以用于其他类型的类,如@Component、@Repository、@Controller和@Service。使用@Bean的方法必须具有返回值,且可以包含任何必要的参数。
@Bean注解是Spring从3.0版本开始提供的注解
简化源码:
@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Bean {
@AliasFor("name")
String[] value() default {};
@AliasFor("value")
String[] name() default {};
boolean autowireCandidate() default true;
String initMethod() default "";
String destroyMethod() default AbstractBeanDefinition.INFER_METHOD;
}
属性介绍
- name:String[]数组类型,指定注入到IOC容器中的Bean的名称,可以指定多个名称。如果不指定name属性和value属性的值,则注入到IOC容器中的Bean的名称默认是方法的名称。
- value:String[]数组类型,从Spring 4.3.3版本开始提供的@Bean的属性,作用与name属性相同。
- autowireCandidate:boolean类型,表示是否支持自动按照类型注入到其他的Bean中。此属性会影响@Autowired注解,不会响应@Resource注解,默认为true,表示支持自动按照类型注入到其他的Bean中。
- initMethod:指定初始化的方法。
- destroyMethod:指定销毁的方法。
测试示例代码
BeanDemo类
package com.yang.SpringTest.bean;
import lombok.extern.slf4j.Slf4j;
/**
* <p>BeanDemo类</p>
*
* @author By: chengxuyuanshitang
* Package com.yang.SpringTest.bean
* Ceate Time 2024-03-12 16:12
*/
@Slf4j
public class BeanDemo {
public BeanDemo() {
log.info("======= 执行构造方法...");
}
public void init() {
log.info("======= 执行初始化方法...");
}
public void destroy() {
log.info("======= 执行销毁方法...");
}
}
BeanDemoConfig配置类
package com.yang.SpringTest.bean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
/**
* <p>配置类</p>
*
* @author By: chengxuyuanshitang
* Package com.yang.SpringTest.bean
* Ceate Time 2024-03-12 16:15
*/
@Configuration
@ComponentScan(basePackages = "com.yang.SpringTest.bean")
public class BeanDemoConfig {
@Bean(initMethod = "init", destroyMethod = "destroy")
public BeanDemo user() {
return new BeanDemo();
}
}
BeanDemoTest测试类
package com.yang.SpringTest.bean;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
/**
* <p>bean测试类</p>
*
* @author By: chengxuyuanshitang
* Package com.yang.SpringTest.bean
* Ceate Time 2024-03-12 16:14
*/
@Slf4j
public class BeanDemoTest {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(BeanDemoConfig.class);
log.info("**************** IOC容器启动完成....");
BeanDemo demo1 = context.getBean(BeanDemo.class);
BeanDemo demo2 = context.getBean(BeanDemo.class);
log.info("**************** demo1是否等于demo2 ==>{}", (demo1 == demo2));
context.close();
}
}
运行结果
======= 执行构造方法...
======= 执行初始化方法...
**************** IOC容器启动完成....
**************** demo1是否等于demo2 ==>true