spring IoC @Bean注解 作者:马育民 • 2020-06-11 22:09 • 阅读:10218 # 介绍 ### 应用场景 一般用于让spring容器管理 **第三方的类对象** 。因为第三方类一般在jar包中,无法在这些类上,添加 `@Controller`、`@Service`、`@Repository`、`@Component` 注解,此时就可以用 `@Bean` 注解 较少用于创建 **本工程的类对象**,因为本工程的类对象上,可以用 `@Controller`、`@Service`、`@Repository`、`@Component` 注解 ### 使用方法 一般用在 **配置类** 中,修饰 **方法**,该方法 **返回一个bean对象** ### 作用 `@Bean `注解相当于传统`application-config.xml`配置文件中的``标签 把方法的 **返回值(Bean对象)**,放入到Spring IOC容器中 **默认为单例模式**,修改作用域需要搭配 `@Scope` 注解 ### 属性 - `name`:指定该bean对象在spring容器中的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配置文件: ``` ``` ### 执行 ``` 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" })` 原文出处:http://malaoshi.top/show_1EF5gry55aKL.html