@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