介绍
应用场景
一般用于让spring容器管理 第三方的类对象 。因为第三方类一般在jar包中,无法在这些类上,添加 @Controller、@Service、@Repository、@Component 注解,此时就可以用 @Bean 注解
较少用于创建 本工程的类对象,因为本工程的类对象上,可以用 @Controller、@Service、@Repository、@Component 注解
使用方法
一般用在 配置类 中,修饰 方法,该方法 返回一个bean对象
作用
@Bean注解相当于传统application-config.xml配置文件中的<bean>标签
把方法的 返回值(Bean对象),放入到Spring IOC容器中
默认为单例模式,修改作用域需要搭配 @Scope 注解
属性
name:指定该bean对象在spring容器中的id,相当于<bean id="">标签的id属性。
如果不指定,默认为 该方法的名称
其类型是String[],所以支持多个id
例子
本例为了易于理解、实现简单,所以 用于创建本工程的类对象
UserSrvImpl
public class UserSrvImpl implements IUserService {
public UserSrvImpl(){
System.out.println("UserSrvImpl构造方法");
}
public void save(String username,String password){
System.out.println("UserSrvImpl保存 "+username+"-"+password);
}
}
ApplicationConfig
@Configuration
@ComponentScan("top.malaoshi")
public class ApplicationConfig {
@Bean
public UserSrvImpl getUserSrvImpl(){
return new UserSrvImpl();
}
}
这里使用 @Bean 注解,由于没有指定 name 属性,那么spring容器中的id是方法名: getUserSrvImpl
相当于xml配置文件:
<beans>
<bean id="getUserSrvImpl" class="top.malaoshi.UserSrvImpl"/>
</beans>
执行
public class Main {
public static void main(String[] args) {
ApplicationContext ac=new AnnotationConfigApplicationContext(ApplicationConfig.class);
IUserService srv=(IUserService)ac.getBean("getUserSrvImpl");
IUserService srv2=(IUserService)ac.getBean("getUserSrvImpl");
System.out.println(srv);
System.out.println(srv2);
System.out.println(srv==srv2);
}
}
执行结果:
UserSrvImpl构造方法
top.malaoshi.UserSrvImpl@e677af
top.malaoshi.UserSrvImpl@e677af
true
两个对象的内存地址是相同的,说明是单例模式
自定义bean的命名
默认情况下bean的名称和方法名称相同,你也可以使用name属性来指定
ApplicationConfig
@Configuration
@ComponentScan("top.malaoshi")
public class ApplicationConfig {
@Bean(name="user")
public UserSrvImpl getUserSrvImpl(){
return new UserSrvImpl();
}
}
主启动类
public class Main {
public static void main(String[] args) {
ApplicationContext ac=new AnnotationConfigApplicationContext(ApplicationConfig.class);
IUserService srv=(IUserService)ac.getBean("user");
IUserService srv2=(IUserService)ac.getBean("user");
System.out.println(srv);
System.out.println(srv2);
System.out.println(srv==srv2);
}
}
支持多个名
@Bean(name = { "userSrvImpl", "userSrvImpl2" })