文章遷移自語雀。
怎么查看spring的文檔
ioc綜述
說到spring的ioc,其實就是控制反轉,為啥需要控制反轉呢,其實是為了功能的增強,如果不用spring, 我們直接使用工廠方法,靜態(tài)工廠方法, 都是是可以獲取到對象的,但是如果需求變了,我們在類的生成時,添加了很多信息,使用工廠就不方便了,還有事務等需要統一的處理.一個典型的應用就是mybatis的接口,平時我們都是只需要寫mybatis的接口,但是不寫他的實現類,由spring生成一個代理的實現類,來進行方法的調用.對于事務的調用,在service上添加了事務,需要調用dao進行統一的控制.所以需要一個統一的bean對象的管理,就是ioc了,當然了,還可以使用google的juice.
說一點spring3和spring4的區(qū)別,spring3提供接口注入.
ioc注入
現在看spring ioc的文檔, 5.2版本的文檔,現在提供的注入方式有兩種,構造方法和set方法注入.
如果使用xml進行配置,在寫<bean>標簽時,默認是使用的類型注入,就是default-autowired=byType
注解注入
說下我們經常使用的@Autowired注解
默認使用的是根據類型注入,如果類型沒有找到,就根據屬性名在去查找,找不到就報錯了.
通過查看spring的源碼,當把@Autowired寫在屬性上的時候,spring是使用的反射,獲取該屬性的Field,再進行值的設置,完成屬性的注入.
@Resource注解可以指定bean的名字和類型,根據屬性名注入,跟set方法的名字就沒有關系了
自定義bean名字生成
最后說一個自定義bean的名字生成策略
BeanNameGenerator 接口
步驟如下:
1.自定義類實現BeanNameGenerator接口,重寫方法
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanNameGenerator;
/**
* 自定義bean name的生成策略
*/
public class MyBeanNameGenerator implements BeanNameGenerator {
? ?@Override
? ?public String generateBeanName(BeanDefinition definition, BeanDefinitionRegistry registry) {
? ? ? ?String className = definition.getBeanClassName();
? ? ? ?System.out.println(className);
? ? ? ?int indexOf = className.lastIndexOf(".");
? ? ? ?if (indexOf != -1) {
? ? ? ? ? ?//前面加一個 my,其他的不做處理
? ? ? ? ? ?return "my"+className.substring(indexOf + 1, className.length());
? ? ? ?}
? ? ? ?return null;
? ?}
}
2.通過修改@ComponentScan ?指定類名生成策略.
@ComponentScan(value = "com.onyx",nameGenerator = MyBeanNameGenerator.class)
再次運行spring就可以看到生成的bean 名字了.
測試代碼如下, 就是個main方法:
public static void main(String[] args) {
AnnotationConfigApplicationContext context =
? new AnnotationConfigApplicationContext(AppConfig.class);
String[] names = context.getBeanDefinitionNames();
for (String name : names) {
?System.out.println(name);
}
}
獲取application
如果想要獲取到application對象,需要在類上實現接口implements ApplicationContextAware,
在類中定義變量ApplicationContext applicationContext 進行接收, 賦值.就可以使用了.
Lookup注解
說一個很特殊的應用場景,在一個類的每個方法中,需要使用的類,每次使用的類都要求是不同的對象,每用一次相當于new 一次, 這個時候需要使用到@LookUp("userDao") 注解,使用的方法上加上,每個方法獲取的dao就會一個新的對象,而不是一個單例的dao重用.此注解只能加上方法上.使用方法省略,需要的時候再去具體看吧.
spring bean生命周期回調
InitializingBean初始化接口
DisposableBean銷毀對象的接口
注解:
@PostConstruct
@PreDestroy
一個類實現此接口使用使用到具體的回調方法.也可以使用xml的配置,在<bean>標簽中使用init-method=init 初始化方法
spring還存在@DependsOn 注解, 表明此類的生成需要依賴的其他的一個類的步驟.
spring掃描
@ComponentScan ?中可以配置 filter等過濾信息,只掃描需要的類,加快spring的啟動速度.里面有一套掃描的形式
還有另外一個方法,添加一個依賴.
<dependency>
? ?<groupId>org.springframework</groupId>
? ?<artifactId>spring-context-indexer</artifactId>
? ?<version>5.2.3.RELEASE</version>
? ?<optional>true</optional>
</dependency>
這個依賴會加快spring的啟動速度.
Primary注解
前段時間做項目,我們項目經理用的eclipse,他啟動項目一定要加上@Primary 注解, 否則啟動報錯,我做的這個項目,我就納悶了, 我的一個接口就一個實現類,不可能有重名的,不知道eclipse有什么bug,我用idea啟動完全沒問題.
一個接口,兩個實現類,其他地方根據接口注入了,如果不做修改會報錯,說找到了兩個類.
解決辦法 在一個類上標記@Primary? 或者使用@Qualifier ,名字做區(qū)分.
@Profile
各種環(huán)境中類的實例化,類上添加,
激活@Profile. ?
context.getEnvironment().setActiveProfile("....")
好處就是可以自由的切換類, 配置文件.
spring-jdbc 通用鏈接,自己做測試用.
spring的循環(huán)依賴
修改了application, 之后需要重新reshesh一下.
什么時候用xml
什么時候用注解
什么時候用java config
根據項目來,如果想精通spring,就三者混合這來.
不得不說寫總結性的文章真的好要時間,寫這個文章的時候,程程剛在睡覺,那時候剛過10點,現在都11點了,只希望疫情能夠早點結束,早日能夠看到她,我的心情就像外面的濛濛細雨一樣,外面的天空是灰蒙蒙的,哎.
科文章來源:http://www.zghlxwxcb.cn/news/detail-774481.html
2020年2月14日11:08:02文章來源地址http://www.zghlxwxcb.cn/news/detail-774481.html
到了這里,關于Spring-IOC綜述的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!