今日目標(biāo)
?
掌握純注解開發(fā)依賴注入(DI)模式
學(xué)習(xí)使用純注解進(jìn)行第三方Bean注入
1 注解開發(fā)依賴注入(DI)【重點(diǎn)】
問題導(dǎo)入
思考:如何使用注解方式將Bean對(duì)象注入到類中
1.1 使用@Autowired注解開啟自動(dòng)裝配模式(按類型)
@Service
public?class?StudentServiceImpl?implements?StudentService?{
????//創(chuàng)建成員對(duì)象
????//@Autowired:注入引用類型,自動(dòng)裝配模式,默認(rèn)按類型裝配
????@Autowired
????private?StudentDao?studentDao?;
????@Override
????public?void?save()?{
????????System.out.println("Service:?添加學(xué)生信息到數(shù)據(jù)庫(kù)...");
????????studentDao.save();
????}
}
說明:不管是使用配置文件還是配置類,都必須進(jìn)行對(duì)應(yīng)的Spring注解包掃描才可以使用。@Autowired默認(rèn)按照類型自動(dòng)裝配,如果IoC容器中同類的Bean有多個(gè),那么默認(rèn)按照變量名和Bean的名稱匹配,建議使用@Qualifier注解指定要裝配的bean名稱
注意:自動(dòng)裝配基于反射設(shè)計(jì)創(chuàng)建對(duì)象并暴力反射對(duì)應(yīng)屬性為私有屬性初始化數(shù)據(jù),因此無需提供setter方法。
1.2 使用@Qualifier注解指定要裝配的bean名稱
目的:解決IoC容器中同類型Bean有多個(gè)裝配哪一個(gè)的問題
@Service
public?class?StudentServiceImpl?implements?StudentService?{
????//創(chuàng)建成員對(duì)象
????//@Autowired:注入引用類型,自動(dòng)裝配模式,默認(rèn)按類型裝配
????@Autowired
????//@Qualifier:自動(dòng)裝配bean時(shí)按bean名稱裝配
????@Qualifier("studentDaoImpl")
????private?StudentDao?studentDao?;
????@Override
????public?void?save()?{
????????System.out.println("Service:?添加學(xué)生信息到數(shù)據(jù)庫(kù)...");
????????studentDao.save();
????}
}
注意:@Qualifier注解無法單獨(dú)使用,必須配合@Autowired注解使用
1.3 使用@Value實(shí)現(xiàn)簡(jiǎn)單類型注入
@Repository
public?class?StudentDaoImpl?implements?StudentDao?{
????//@Value:注入簡(jiǎn)單類型(無需提供set方法)
????@Value("${test.name}")
????private?String?name;
????@Override
????public?void?save()?{
????????System.out.println("DAO:?name=?"+name);
????????System.out.println("DAO:?添加學(xué)生信息到數(shù)據(jù)庫(kù)...");
????}
}
以上@Value注解中使用${test.name}從屬性文件中讀取test.name值,那么就需要在配置類或者配置文件中加載屬性文件。
@Configuration
@ComponentScan("com.itheima")
//@PropertySource加載properties配置文件
@PropertySource("classpath:test.properties")?//如果是多個(gè)屬性文件,則使用{}數(shù)組
public?class?SpringConfig?{
}
注意:@PropertySource中加載多文件請(qǐng)使用數(shù)組格式配置,不允許使用通配符*
2 注解開發(fā)管理第三方Bean【重點(diǎn)】
問題導(dǎo)入
思考:導(dǎo)入自己定義的配置類有幾種方式?
【第零步】pom.xml添加數(shù)據(jù)庫(kù)依賴
<!--?mysql?驅(qū)動(dòng)-->
<dependency>
????<groupId>mysql</groupId>
????<artifactId>mysql-connector-java</artifactId>
????<version>8.0.30</version>
</dependency>
<!--druid包-->
<dependency>
????<groupId>com.alibaba</groupId>
????<artifactId>druid</artifactId>
????<version>1.2.18</version>
</dependency>
【第一步】單獨(dú)定義配置類在config包下創(chuàng)建
package?com.zbbmeta.config;
import?com.alibaba.druid.pool.DruidDataSource;
import?org.springframework.context.annotation.Bean;
import?javax.sql.DataSource;
public?class?JdbcConfig?{
????//@Bean:表示當(dāng)前方法的返回值是一個(gè)bean對(duì)象,添加到IOC容器中
????@Bean
????public?DataSource?dataSource(){
????????DruidDataSource?ds?=?new?DruidDataSource();
????????ds.setDriverClassName("com.mysql.cj.jdbc.Driver");
????????ds.setUrl("jdbc:mysql://localhost:3306/spring_druid");
????????ds.setUsername("root");
????????ds.setPassword("root");
????????return?ds;
????}
}
【第二步】將獨(dú)立的配置類加入核心配置
方式1:@Import注解導(dǎo)入式
@Configuration?//?指定這個(gè)類為配置類,替代application.xml
@ComponentScan("com.zbbmeta")//代替<context:component-scan?base-package="com.zbbmeta"?/>
@PropertySource("classpath:test.properties")?//如果是多個(gè)屬性文件,則使用{}數(shù)組
@Import(JdbcConfig.class)??//加載JdbcConfig配置類
public?class?SpringConfig?{
}
方式2:@ComponentScan掃描式
-
JdbcConfig類上添加注解
@Configuration
public?class?JdbcConfig?{
????//@Bean:表示當(dāng)前方法的返回值是一個(gè)bean對(duì)象,添加到IOC容器中
????@Bean
????public?DataSource?dataSource(){
????????DruidDataSource?ds?=?new?DruidDataSource();
????????ds.setDriverClassName("com.mysql.cj.jdbc.Driver");
????????ds.setUrl("jdbc:mysql://localhost:3306/spring_druid");
????????ds.setUsername("root");
????????ds.setPassword("root");
????????return?ds;
????}
}
-
SpringConfig配置不變
@Configuration?//?指定這個(gè)類為配置類,替代application.xml
@ComponentScan("com.zbbmeta")//代替<context:component-scan?base-package="com.zbbmeta"?/>
@PropertySource("classpath:test.properties")?//如果是多個(gè)屬性文件,則使用{}數(shù)組
//@Import(JdbcConfig.class)??//加載JdbcConfig配置類
public?class?SpringConfig?{
}
3 注解開發(fā)為第三方Bean注入資源【重點(diǎn)】
問題導(dǎo)入
思考:配置類中如何注入簡(jiǎn)單類型數(shù)據(jù),如何注入引用類型數(shù)據(jù)?
3.1 簡(jiǎn)單類型依賴注入
public?class?JdbcConfig?{
????
????@Value("com.mysql.jdbc.Driver")
????private?String?driver;
????@Value("jdbc:mysql://localhost:3306/spring_db")
????private?String?url;
????@Value("root")
????private?String?userName;
????@Value("root")
????private?String?password;
????
????//1.定義一個(gè)方法獲得要管理的對(duì)象
????//2.@Bean:表示當(dāng)前方法的返回值是一個(gè)bean對(duì)象,添加到IOC容器中
????@Bean
????public?DataSource?dataSource(){
????????DruidDataSource?ds?=?new?DruidDataSource();
????????ds.setDriverClassName(driver);
????????ds.setUrl(url);
????????ds.setUsername(userName);
????????ds.setPassword(password);
????????return?ds;
????}
}
說明:如果@Value()中使用了EL表達(dá)式讀取properties屬性文件中的內(nèi)容,那么就需要加載properties屬性文件。
3.2 引用類型依賴注入
//Spring會(huì)自動(dòng)從IOC容器中根據(jù)類型找到StudentDao對(duì)象賦值給參數(shù)studentDao變量,如果沒有就會(huì)報(bào)錯(cuò)。
????@Bean
????public?DataSource?dataSource(StudentDao?studentDao){
????????System.out.println("JdbcConfig??studentDao?=?"?+?studentDao);
????????DruidDataSource?ds?=?new?DruidDataSource();
????????ds.setDriverClassName(driver);
????????ds.setUrl(url);
????????ds.setUsername(userName);
????????ds.setPassword(password);
????????return?ds;
????}
注意:引用類型注入只需要為bean定義方法設(shè)置形參即可,容器會(huì)根據(jù)類型自動(dòng)裝配對(duì)象
3.3 測(cè)試類
????@Test
????public?void?testDatasource()?throws?SQLException?{
????????//目標(biāo):從IOC容器中獲取德魯伊連接池對(duì)象
????????//1.AnnotationConfigApplicationContext加載Spring配置類初始化Spring容器
????????AnnotationConfigApplicationContext?ac?=?new?AnnotationConfigApplicationContext(SpringConfig.class);
????????//按類型獲取bean
????????DataSource?dataSource?=?ac.getBean(DataSource.class);
????????Connection?connection?=?dataSource.getConnection();
????????//3.打印對(duì)象
????????System.out.println("連接池對(duì)象:"+dataSource);
????????System.out.println("連接象地址:"+connection);
????????//4.關(guān)閉容器
????????ac.close();
????}
3.4 注解開發(fā)總結(jié)
文章來源:http://www.zghlxwxcb.cn/news/detail-633537.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-633537.html
到了這里,關(guān)于Spring-2-深入理解Spring 注解依賴注入(DI):簡(jiǎn)化Java應(yīng)用程序開發(fā)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!