網(wǎng)站首頁 編程語言 正文
目錄
1.完全注解開發(fā)理解
2.實驗一:配置類和掃描注解
3.實驗二:@Bean定義組件
4.實驗三:高級特性:@Bean注解細(xì)節(jié)
5.實驗四:高級特性@Import擴(kuò)展
6.總結(jié)
1)XML方式配置總結(jié)
2)XML+注解方式配置總結(jié)
3)完全注解方式配置總結(jié)
1.完全注解開發(fā)理解
Spring 完全注解配置(Fully Annotation-based Configuration)是指通過 Java配置類 代碼來配置 Spring 應(yīng)用程序,使用注解來替代原本在 XML 配置文件中的配置。相對于 XML 配置,完全注解配置具有更強(qiáng)的類型安全性和更好的可讀性。
兩種方式思維轉(zhuǎn)換
2.實驗一:配置類和掃描注解
使用xml+注解方式與配置類+注解方式時,測試創(chuàng)建IoC容器的寫法區(qū)別:
// xml方式配置文件使用ClassPathXmlApplicationContext容器讀取
ApplicationContext applicationContext =
new ClassPathXmlApplicationContext("application.xml");
// AnnotationConfigApplicationContext 根據(jù)配置類創(chuàng)建 IOC 容器對象
ApplicationContext iocContainerAnnotation =
new AnnotationConfigApplicationContext(MyConfiguration.class);
//可以使用 no-arg 構(gòu)造函數(shù)實例化 AnnotationConfigApplicationContext ,然后使用 register() 方法對其進(jìn)行配置。此方法在以編程方式生成 AnnotationConfigApplicationContext 時特別有用。以下示例演示如何執(zhí)行此操作:
// AnnotationConfigApplicationContext-IOC容器對象
ApplicationContext iocContainerAnnotation =
new AnnotationConfigApplicationContext();
//外部設(shè)置配置類
iocContainerAnnotation.register(MyConfiguration.class);
//刷新后方可生效?。?iocContainerAnnotation.refresh();
總結(jié):
@Configuration指定一個類為配置類,可以添加配置注解,替代配置xml文件
@ComponentScan(basePackages = {"包","包"}) 替代<context:component-scan標(biāo)簽實現(xiàn)注解掃描
@PropertySource("classpath:配置文件地址") 替代 <context:property-placeholder標(biāo)簽
配合IoC/DI注解,可以進(jìn)行完整注解開發(fā)!
3.實驗二:@Bean定義組件
場景需求:將Druid連接池對象存儲到IoC容器
需求分析:第三方j(luò)ar包的類,添加到ioc容器,無法使用@Component等相關(guān)注解!因為源碼jar包內(nèi)容為只讀模式!
配置類方式實現(xiàn):
@Bean注釋用于指示方法實例化、配置和初始化要由 Spring IoC 容器管理的新對象。對于那些熟悉 Spring 的 <beans/>XML 配置的人來說, @Bean?注釋與 <bean/>?元素起著相同的作用。
//標(biāo)注當(dāng)前類是配置類,替代application.xml
@Configuration
//引入jdbc.properties文件
@PropertySource({"classpath:application.properties","classpath:jdbc.properties"})
@ComponentScan(basePackages = {"com.atguigu.components"})
public class MyConfiguration {
//如果第三方類進(jìn)行IoC管理,無法直接使用@Component相關(guān)注解
//解決方案: xml方式可以使用<bean標(biāo)簽
//解決方案: 配置類方式,可以使用方法返回值+@Bean注解
@Bean
public DataSource createDataSource(@Value("${jdbc.user}") String username,
@Value("${jdbc.password}")String password,
@Value("${jdbc.url}")String url,
@Value("${jdbc.driver}")String driverClassName){
//使用Java代碼實例化
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUsername(username);
dataSource.setPassword(password);
dataSource.setUrl(url);
dataSource.setDriverClassName(driverClassName);
//返回結(jié)果即可
return dataSource;
}
}
4.實驗三:高級特性:@Bean注解細(xì)節(jié)
@Bean生成BeanName問題:
@Bean注解源碼:
public @interface Bean {
//前兩個注解可以指定Bean的標(biāo)識
@AliasFor("name")
String[] value() default {};
@AliasFor("value")
String[] name() default {};
//autowireCandidate 屬性來指示該 Bean 是否候選用于自動裝配。
//autowireCandidate 屬性默認(rèn)值為 true,表示該 Bean 是一個默認(rèn)的裝配目標(biāo),
//可被候選用于自動裝配。如果將 autowireCandidate 屬性設(shè)置為 false,則說明該 Bean 不是默認(rèn)的裝配目標(biāo),不會被候選用于自動裝配。
boolean autowireCandidate() default true;
//指定初始化方法
String initMethod() default "";
//指定銷毀方法
String destroyMethod() default "(inferred)";
}
`@Bean` 注釋注釋方法。使用此方法在指定為方法返回值的類型的 `ApplicationContext` 中注冊 Bean 定義。缺省情況下,Bean 名稱與方法名稱相同。下面的示例演示 `@Bean` 方法聲明:
@Configuration
public class AppConfig {
@Bean
public TransferServiceImpl transferService() {
return new TransferServiceImpl();
}
}
指定@Bean的名稱:
@Configuration
public class AppConfig {
@Bean("myThing") //指定名稱
public Thing thing() {
return new Thing();
}
}
@Bean初始化和銷毀方法指定
2.周期方法的問題 --- 1)和以前一樣用@PostConstruct和@PreDestroy 2)用@Bean的屬性initMethod和destroyMethod
public class BeanOne {
public void init() {
// initialization logic
}
}
public class BeanTwo {
public void cleanup() {
// destruction logic
}
}
@Configuration
public class AppConfig {
@Bean(initMethod = "init")
public BeanOne beanOne() {
return new BeanOne();
}
@Bean(destroyMethod = "cleanup")
public BeanTwo beanTwo() {
return new BeanTwo();
}
}
@Bean Scope作用域
作用域 --- 和以前一樣 @Scope(scopeName = ConfigurableBeanFactory.SCOPE_SINGLETON)
如何引用其他的IoC組件
方案1:
直接調(diào)用方法返回 Bean 實例:在一個 `@Bean` 方法中直接調(diào)用其他 `@Bean` 方法來獲取 Bean 實例,雖然是方法調(diào)用,也是通過IoC容器獲取對應(yīng)的Bean,例如:
@Configuration
public class JavaConfig {
@Bean
public HappyMachine happyMachine(){
return new HappyMachine();
}
@Bean
public HappyComponent happyComponent(){
HappyComponent happyComponent = new HappyComponent();
//直接調(diào)用方法即可!
happyComponent.setHappyMachine(happyMachine());
return happyComponent;
}
}
方案二:
參數(shù)引用法:通過方法參數(shù)傳遞 Bean 實例的引用來解決 Bean 實例之間的依賴關(guān)系,例如:
package com.atguigu.config;
import com.atguigu.ioc.HappyComponent;
import com.atguigu.ioc.HappyMachine;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* projectName: com.atguigu.config
* description: 配置HappyComponent和HappyMachine關(guān)系
*/
@Configuration
public class JavaConfig {
@Bean
public HappyMachine happyMachine(){
return new HappyMachine();
}
/**
* 可以直接在形參列表接收IoC容器中的Bean!
* 情況1: 直接指定類型即可
* 情況2: 如果有多個bean,(HappyMachine 名稱 ) 形參名稱等于要指定的bean名稱!
* 例如:
* @Bean
* public Foo foo1(){
* return new Foo();
* }
* @Bean
* public Foo foo2(){
* return new Foo()
* }
* @Bean
* public Component component(Foo foo1 / foo2 通過此處指定引入的bean)
*/
@Bean
public HappyComponent happyComponent(HappyMachine happyMachine){
HappyComponent happyComponent = new HappyComponent();
//賦值
happyComponent.setHappyMachine(happyMachine);
return happyComponent;
}
}
5.實驗四:高級特性@Import擴(kuò)展
@Import 注釋允許從另一個配置類加載 @Bean 定義,如以下示例所示:
@Configuration
public class ConfigA {
@Bean
public A a() {
return new A();
}
}
@Configuration
@Import(ConfigA.class)
public class ConfigB {
@Bean
public B b() {
return new B();
}
}
現(xiàn)在,在實例化上下文時不需要同時指定 `ConfigA.class` 和 `ConfigB.class` ,只需顯式提供 `ConfigB` ,如以下示例所示:
public static void main(String[] args) {
ApplicationContext ctx = new AnnotationConfigApplicationContext(ConfigB.class);
// now both beans A and B will be available...
A a = ctx.getBean(A.class);
B b = ctx.getBean(B.class);
}
6.總結(jié)
1)XML方式配置總結(jié)
1. 所有內(nèi)容寫到xml格式配置文件中
2. 聲明bean通過<bean標(biāo)簽
3. <bean標(biāo)簽包含基本信息(id,class)和屬性信息 <property name value / ref
4. 引入外部的properties文件可以通過<context:property-placeholder
5. IoC具體容器實現(xiàn)選擇ClassPathXmlApplicationContext對象
2)XML+注解方式配置總結(jié)
1. 注解負(fù)責(zé)標(biāo)記IoC的類和進(jìn)行屬性裝配
2. xml文件依然需要,需要通過<context:component-scan標(biāo)簽指定注解范圍
3. 標(biāo)記IoC注解:@Component,@Service,@Controller,@Repository?
4. 標(biāo)記DI注解:@Autowired @Qualifier @Resource @Value
5. IoC具體容器實現(xiàn)選擇ClassPathXmlApplicationContext對象
3)完全注解方式配置總結(jié)
1. 完全注解方式指的是去掉xml文件,使用配置類 + 注解實現(xiàn)
2. xml文件替換成使用@Configuration注解標(biāo)記的類
3. 標(biāo)記IoC注解:@Component,@Service,@Controller,@Repository?
4. 標(biāo)記DI注解:@Autowired @Qualifier @Resource @Value
5. <context:component-scan標(biāo)簽指定注解范圍使用@ComponentScan(basePackages = {"com.atguigu.components"})替代
6. <context:property-placeholder引入外部配置文件使用@PropertySource({"classpath:application.properties","classpath:jdbc.properties"})替代
7. <bean 標(biāo)簽使用@Bean注解和方法實現(xiàn)
8. IoC具體容器實現(xiàn)選擇AnnotationConfigApplicationContext對象
原文鏈接:https://blog.csdn.net/weixin_69134926/article/details/136459312
- 上一篇:沒有了
- 下一篇:沒有了
相關(guān)推薦
- 2022-01-09 WHATWG API——url.parse()的替代方案
- 2022-03-23 C語言實現(xiàn)簡單的三子棋游戲源碼_C 語言
- 2022-09-15 python基于tkinter圖形化編程實現(xiàn)簡易計算器功能_python
- 2022-10-14 clickhouse連hadoop集群配置(帶kerberos認(rèn)證)
- 2022-07-09 docker 中進(jìn)程的信號
- 2022-11-17 Rust中的Cargo構(gòu)建、運行、調(diào)試_相關(guān)技巧
- 2022-03-03 css實現(xiàn)tooltip文字提示
- 2022-05-09 Python?matplotlib繪制實時數(shù)據(jù)動畫_python
- 欄目分類
-
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支