你們好,我是小菜,一個渴望在互聯網行業作到蔡不菜的小菜。可柔可剛,點贊則柔,白嫖則剛!java
死鬼~看完記得給我來個三連哦!web
「本文主要介紹
Spring 中IOC的註解開發
若有須要,能夠參考
若有幫助,不忘 點贊 ❥spring創做不易,白嫖無義!數組
的方式註冊public class Person {
private String name;
private Integer age;
//省略 get / set 方法
}
複製代碼
//配置類==配置文件
@Configuration //告訴Spring這是一個配置類
public class MainConfig {
//給容器中註冊一個Bean;類型爲返回值的類型,id默認是用方法名做爲id
//也能夠經過@Bean(value)的方式指定ID
@Bean("person")
public Person person01(){
return new Person("Cbuc", 22);
}
}
複製代碼
public void test01(){
//能夠注意到以前基於xml的時候是 new ClassPathXmlApplicationContext() ,如今基於註解是 new AnnotationConfigApplicationContext()
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
Person person = (Person) applicationContext.getBean("person");
System.out.println(person);
}
複製代碼
成功獲取到注入的類:
session
XML掃描方式:能夠配置配置一些過濾條件app
<context:component-scan base-package="cbuc.lie" use-default-filters="false"></context:component-scan>
複製代碼
註解掃描方式:(@ComponentScan
)
post
FilterType.CUSTOM的使用學習
1)定義一個TypeFilter的實現類MyTypeFilter測試
2)經過@Filter(type=FilterType.CUSTOM,classes={MyTypeFilter.class}
在classes中引入便可ui
經過@Scope
:調整做用域(默認是單實例的)
單實例bean:默認在容器啓動的時候建立對象;
懶加載:容器啓動不建立對象。第一次使用(獲取)Bean建立對象,並初始化;
WindowsCondition
給容器中註冊組件:
包掃描+組件標註註解(@Controller/@Service/@Repository/@Component)
在配置類在經過@Bean 註冊
@Import (快速給容器中導入一個組件)
1)@Import(要導入到容器中的組件);容器中就會自動註冊這個組件,id默認是全類名
2)ImportSelector:返回須要導入的組件的全類名數組
編寫ImportSelector的實現類
在@Import中聲明
3)ImportBeanDefinitionRegistrar:手動註冊bean到容器中
編寫ImportBeanDefinitionRegistrar的實現類
1)默認獲取到的是工廠bean調用getObject建立的對象
2)要獲取工廠Bean自己,咱們須要給id前面加一個&colorFactoryBean
編寫FactoryBean的實現類:
在配置類中註冊:
@Bean
public ColorFactoryBean colorFactoryBean(){
return new ColorFactoryBean();
}
複製代碼
此時雖然注入的是colorFactoryBean,可是獲取到的是Color
bean的生命週期:
bean建立---初始化----銷燬的過程
容器管理bean的生命週期;咱們能夠自定義初始化和銷燬方法;容器在bean進行到當前生命週期的時候來調用咱們自定義的初始化和銷燬方法
1)指定初始化和銷燬方法;
init-method
和destroy-method
咱們建立一個Car類,裏面自定義初始化和銷燬方法:
public class Car {
public Car(){
System.out.println("car constructor...");
}
public void init(){
System.out.println("car ... init...");
}
public void detory(){
System.out.println("car ... detory...");
}
}
複製代碼
註冊到 IOC容器中:
//在 Bean 註解裏面指定初始化和銷燬方法
@Bean(initMethod="init",destroyMethod="detory")
public Car car(){
return new Car();
}
複製代碼
2)經過讓Bean實現
InitializingBean
(定義初始化邏輯)DisposableBean
(定義銷燬邏輯)咱們建立一個Cat類,實現InitializingBean 和 DisposableBean 兩個接口:
@Component //在配置類中開啓包掃描,自動註冊到 IOC 容器中
public class Cat implements InitializingBean,DisposableBean {
public Cat(){
System.out.println("cat constructor...");
}
public void afterPropertiesSet() throws Exception {
//初始化方法
System.out.println("cat...afterPropertiesSet...");
}
public void destroy() throws Exception {
//銷燬方法
System.out.println("cat...destroy...");
}
}
複製代碼
3)使用JSR250
@PostConstruct
:在bean建立完成而且屬性賦值完成,來執行初始化方法@PreDestroy
:在容器銷燬bean以前通知咱們進行清理工做首先建立一個Dog類:
@Component //在配置類中開啓包掃描,自動註冊到 IOC 容器中
public class Dog {
public Dog(){
System.out.println("dog constructor...");
}
//對象建立並賦值以後調用
@PostConstruct
public void init(){
System.out.println("Dog....@PostConstruct...");
}
//容器移除對象以前
@PreDestroy
public void detory(){
System.out.println("Dog....@PreDestroy...");
}
}
複製代碼
4)BeanPostProcessor【interface】:bean的後置處理器
postProcessBeforeInitialization
:在初始化以前工做postProcessAfterInitialization
:在初始化以後工做咱們建立一個 MyBeanPostProcessor 類實現 BeanPostProcessor 接口:
@Component
public class MyBeanPostProcessor implements BeanPostProcessor {
//初始化前進行的操做
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessBeforeInitialization..."+beanName+"=>"+bean);
return bean;
}
//初始化後進行的操做
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessAfterInitialization..."+beanName+"=>"+bean);
return bean;
}
}
複製代碼
使用@Value賦值:
「Spring利用依賴注入(DI),完成對IOC容器中中各個組件的依賴關係賦值
1、@Autowired:自動注入
applicationContext.getBean(BookDao.class)
找到就賦值
若是找到多個相同類型的組件,再將屬性的名稱做爲組件的id去容器中查找:
applicationContext.getBean("bookDao")
使用 @Qualifier
指定須要裝配的組件的id,而不是使用屬性名
自動裝配默認必定要將屬性賦值好,沒有就會報錯
可使用@Autowired(required=false)
容許空裝配
@Primary
:讓Spring進行自動裝配的時候,默認使用首選 也能夠繼續使用 @Qualifier
指定須要裝配的bean的名字,優先級比較高
**2、Spring還支持使用 @Resource(JSR250) 和 @Inject(JSR330) **
@Resource
:3、@Autowired 標記位置 : 構造器,參數,方法,屬性
構造器:若是組件只有一個有參構造器,這個有參構造器的 @Autowired
能夠省略,參數位置的組件仍是能夠自動從容器中獲取
參數(@Autowired 能夠省略)
方法 :@Bean+方法參數;參數從容器中獲取;默認不寫@Autowired效果是同樣的;都能自動裝配
1)
2)
屬性:
Spring爲咱們提供的能夠根據當前環境,動態的激活和切換一系列組件的功能(開發環境、測試環境、生產環境…)
@Profile
:指定組件在哪一個環境的狀況下才能被註冊到容器中,不指定,任何環境下都能註冊這個組件切換環境
1)使用命令行動態參數: 在虛擬機參數位置加載 -Dspring.profiles.active=test
2)代碼的方式激活某種環境
//一、建立一個applicationContext
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
//二、設置須要激活的環境
applicationContext.getEnvironment().setActiveProfiles("dev");
//三、註冊主配置類
applicationContext.register(MainConfigOfProfile.class);
//四、啓動刷新容器
applicationContext.refresh();
複製代碼
「今天的你多努力一點,明天的你就能少說一句求人的話!
我是小菜,一個和你一塊兒學習的男人。
💋