6.使用者、組許可權管理
註解分類
從廣義上Spring註解可以分為兩類:
一類註解是用於註冊Bean
假如IOC容器就是一間空屋子,首先這間空屋子啥都沒有,我們要吃大餐,我們就要從外部搬運食材和餐具進來。這裡把某一樣食材或者某一樣餐具搬進空屋子的操作就相當於每個註冊Bean的註解作用類似。註冊Bean的註解作用就是往IOC容器中放(註冊)東西!
用於註冊Bean的註解: 比如@Component、@Repository、@Controller、@Service、@Configration這些註解就是用於註冊Bean,放進IOC容器中,一來交給spring管理方便解耦,二來還可以進行二次使用,啥是二次使用呢?這裡的二次使用可以理解為:在你開始從外部搬運食材和餐具進空屋子的時候,一次性搬運了豬肉、羊肉、鐵勺、筷子四樣東西,這個時候你要開始吃大餐,首先你吃東西的時候肯定要用筷子或者鐵勺,別說你手抓,只要你需要,你就會去找,這個時候發現你已經把筷子或者鐵勺放進了屋子,你就不用再去外部拿筷子進屋子了,意思就是IOC容器中已經存在,就可以只要拿去用,而不必再去註冊!而拿屋子裡已有的東西的操作就是下面要講的用於使用Bean的註解!
一類註解是用於使用Bean
用於使用Bean的註解:比如@Autowired , @Resource註解,這些註解就是把屋子裡的東西自己拿來用,如果你要拿,前提一定是屋子(IOC)裡有的,不然就會報錯,比如你要做一道牛肉拼盤需要五頭牛做原材料才行,你現在鍋裡只有四頭牛,這個時候你知道,自己往屋子裡搬過五頭牛,這個時候就直接把屋子裡的那頭牛直接放進鍋裡,完成牛肉拼盤的組裝。是的這些註解就是需要啥想要啥,只要容器中有就往容器中拿!而這些註解又有各自的區別,比如@Autowired用在筷子上,這筷子你可能只想用木質的,或許只想用鐵質的,@Autowired作用在什麼屬性的筷子就那什麼筷子,而@Resource如果用在安格斯牛肉上面,就指定要名字就是安格斯牛肉的牛肉。
@bean
註解
@Component
、@Repository
、@Controller
、@Service
這些註解只侷限於自己編寫的類,而@Bean
註解和@Import
能把第三方庫中的類例項加入IOC容器中並交給spring管理
Spring的@Bean註解用於告訴方法,產生一個Bean物件,然後這個Bean物件交給Spring管理。 產生這個Bean物件的方法Spring只會呼叫一次,隨後這個Spring將會將這個Bean物件放在自己的IOC容器中。@Bean明確地指示了一種方法,什麼方法呢?產生一個bean的方法,並且交給Spring容器管理;從這我們就明白了為啥@Bean是放在方法的註釋上了,因為它很明確地告訴被註釋的方法,你給我產生一個Bean,然後交給Spring容器,剩下的你就別管了。@Bean就放在方法上,就是讓方法去產生一個Bean,然後交給Spring容器。
@Configuration
public class MyConfig {
@Bean
public User user() {
User user = new User();
user.setCat(cat());
return user;
}
@Bean
public Cat cat() {
return new Cat();
}
}
@Configuration
註解
用於定義配置類,替換xml檔案,通常搭配@Bean
使用
spring5.2之後新增lite模式Full模式和Lite模式是針對spring配置而言的,和xml配置無關。
Lite模式:
- 類上有
@Component
註解 - 類上有
@ComponentScan
註解 - 類上有
@Import
註解 - 類上有
@ImportResource
註解 - 類上沒有任何註解,但是類中存在
@Bean
方法 - 類上有
@Configuration(proxyBeanMethods = false)
註解
Lite總結:執行時不用生成CGLIB子類,提高執行效能,降低啟動時間,可以作為普通類使用。但是不能宣告@Bean之間的依賴
Full模式:
- 標註有
@Configuration
或者@Configuration(proxyBeanMethods = true)
的類被稱為Full模式的配置類
Full模式總結:單例模式能有效避免Lite模式下的錯誤。效能沒有Lite模式好
上面的程式碼中user元件依賴了cat元件,此時@Configuration(proxyBeanMethods = true)
@Import
註解
@import
(User.class,Cat.class,MyImportSelector.class): 給容器中自動創建出這兩個型別的元件、預設元件的名字就是全類名
public class MyImportSelector implements ImportSelector {
/**
* 可以返回空陣列,返回null會報空指標異常
*
* @param importingClassMetadata:當前標註@Import註解的所有註解資訊
* @return 返回值就是要匯入容器元件的全類名
*/
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
return new String[]{"com.jay.pojo.Blue","com.jay.pojo.Red"};
}
}
@Conditional
註解
按照條件裝配,滿足Conditional指定的條件,則進行元件注入,可以作用在類上和方法上,下圖是改註解的衍生子類註解
@Configuration
@Import({MyImportSelector.class})
//表示當前spring容器中有cat時,在把該bean加到spring容器裡面
@ConditionalOnBean(Cat.class)
public class MyConfig {
@Bean
public User user() {
return new User();
}
}
@ConfigurationProperties
註解
配置繫結:讀取配置檔案中的內容
user:
name: "zhangsan"
age: 18
cat:
name: "tomcat"
age: 3
@EnableConfigurationProperties(User.class)
- 開啟User屬性繫結功能
- 把User元件自動註冊在spring容器中
@Configuration
@EnableConfigurationProperties(User.class)
public class MyConfig {
}
@ConfigurationProperties(prefix = "user")
@ConfigurationProperties(prefix = "user")
public class User {
private String name;
private Integer age;
private Cat cat;
}