Spring 方法注解@Bean及配置類掃描路徑
引入
類注解是添加到某個類上的,但是存在兩個問題
1. 使?外部包?的類,沒辦法添加類注解
2. ?個類,需要多個對象,?如多個數據源
這種場景,我們就需要使??法注解 @Bean
一:@Bean方法注解
1:方法注解要搭配類注解使用
@Component public class BeanConfig { @Bean public User user() { User user = new User(); user.setName("zhangsan"); user.setAge(18); return user; } }
@SpringBootApplication public class SpringIocDemoApplication { public static void main(String[] args) { // 獲取Spring上下?對象 ApplicationContext context = SpringApplication.run(SpringIocDemoApplication.class, args); // 從Spring上下?中獲取對象 User user = context.getBean(User.class); // 使?對象 System.out.println(user); } }
2:執(zhí)行結果
如果不搭配類注解使用,Spring會報錯沒有找到這樣一個Bean對象
二:如何定義多個對象
我們試想一下,如果一個類中,有多個方法都被@Bean注解修飾了,那么Spring在調用的時候怎么區(qū)分,我們需要調用的是哪個方法呢,比如上面的舉例,有user1方法,user2方法
1:代碼示例及運行結果
main方法沿用上述的
@Component public class BeanConfig { @Bean public User user1() { User user = new User(); user.setName("zhangsan"); user.setAge(18); return user; } @Bean public User user2() { User user = new User(); user.setName("lisi"); user.setAge(19); return user; } }
報錯信息顯?:期望只有?個匹配,結果發(fā)現了兩個,user1,user2
從報錯信息中,可以看出來,@Bean注解的bean,bean的名稱就是它的?法名
2:根據名稱獲取bean對象
@SpringBootApplication public class SpringIocDemoApplication { public static void main(String[] args) { // 獲取Spring上下?對象 ApplicationContext context = SpringApplication.run(SpringIocDemoApplication.class, args); // 根據bean名稱, 從Spring上下?中獲取對象 User user1 = (User) context.getBean("user1"); User user2 = (User) context.getBean("user2"); System.out.println(user1); System.out.println(user2); } }
3:重命名Bean
通過設置name屬性給Bean對象進?重命名操作,掃描線程類SpringIocDemoApplication代碼此處省略(可參考上面)
(1)代碼示例
@Bean(name = {"u1","user1"}) public User user1(){ User user = new User(); user.setName("zhangsan"); user.setAge(18); return user; }
(2)注意點
name={}可以省略,只有?個名稱時,{}也可以省略
三:掃描路徑
思考:如果對象很多,我們實際用到的對象很少,那么Spring全都掃描一遍是不是非常浪費資源,那么掃描線程類SpringIocDemoApplication的掃描范圍是如何規(guī)定的呢?
1:移動掃描線程類
我們把掃描線程類放到controller包路徑下,在運行代碼試試
@SpringBootApplication public class SpringIocDemoApplication { public static void main(String[] args) { // 獲取Spring上下?對象 ApplicationContext context = SpringApplication.run(SpringIocDemoApplication.class, args); // 從Spring上下?中獲取對象 User u1 = (User) context.getBean("u1"); // 使?對象 System.out.println(u1); } }
2:運行結果
解釋:沒有bean的名稱為u1,因為掃描線程類此時處于controller包下,那么默認只掃描controller包路徑下的類,所以沒有被掃描到的類,當然就拿不到bean對象了。
3:配置掃描路徑@ComponentScan({})
@ComponentScan({"com.example.demo"})
在掃描線程類上加上注解@ComponentScan({"com.example.demo"}),就可以了
(1)注意點
{}?可以配置多個包路徑,但是實際應用并不做推薦
(2)默認掃描范圍
思考:為什么前?沒有配置@ComponentScan注解也可以呢?
@ComponentScan 注解雖然沒有顯式配置,但是實際上已經包含在了啟動類聲明注解@SpringBootApplication 中了,默認掃描的范圍是SpringBoot啟動類所在包及其?包
(3)推薦做法
把啟動類放在我們希望掃描的包的路徑下,這樣我們定義的bean就都可以被掃描到
到此這篇關于Spring 方法注解@Bean及配置類掃描路徑的文章就介紹到這了,更多相關Spring 注解@Bean內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!