java元婴期(18)----java进阶(spring(2)----DI(依赖注入)基于注解的IOC与DI配置properties)
1.依賴注入的概念
依賴注入:Dependency Injection。它是spring框架核心ioc的具體實現。 我們的程序在編寫時,通過控制反轉,把對象的創建交給了spring,但是代碼中不可能出現沒有依賴的情況。ioc解耦只是降低他們的依賴關系,但不會消除。例如:我們的業務層仍會調用持久層的方法。 那這種業務層和持久層的依賴關系,在使用spring之后,就讓spring來維護了。 簡單的說,就是坐等框架把持久層對象傳入業務層,而不用我們自己去獲取。
2.注入方式
?
能注入的數據:有三類
- ? ? ? ? ? ? ? ? 基本類型和String
- ? ? ? ? ? ? ? ? 其他bean類型(在配置文件中或者注解配置過的bean)
- ? ? ? ? ? ? ? ? 復雜類型/集合類型
? 注入的方式:有三種
? ? ? ? ? ? ? ?1.第一種:使用構造函數提供
? ? ? ? ? ? ? ?2.第二種:使用set方法提供
? ? ? ? ? ? ? ?3.第三種:使用注解提供
1.構造函數注入:
? ? ? ? 使用的標簽:constructor-arg
? ? ? ? 標簽出現的位置:bean標簽的內部
? ? ? ? 標簽中的屬性
? ? ? ? ? ? type:用于指定要注入的數據的數據類型,該數據類型也是構造函數中某個或某些參數的類型
? ? ? ? ? ? index:用于指定要注入的數據給構造函數中指定索引位置的參數賦值。索引的位置是從0開始
? ? ? ? ? ? name:用于指定給構造函數中指定名稱的參數賦值(常用的)
? ? ? ? ? ? =============以上三個用于指定給構造函數中哪個參數賦值===============================
? ? ? ? ? ? value:用于提供基本類型和String類型的數據
? ? ? ? ? ? ref:用于指定其他的bean類型數據。它指的就是在spring的Ioc核心容器中出現過的bean對象
? ? ? ? 優勢:
? ? ? ? ? ? 在獲取bean對象時,注入數據是必須的操作,否則對象無法創建成功。
? ? ? ? 弊端:
? ? ? ? ? ? 改變了bean對象的實例化方式,使我們在創建對象時,如果用不到這些數據,也必須提供。
獲取的對象類必須有有參構造方法
public class AccountServiceImpl implements IAccountService {//如果是經常變化的數據,并不適用于注入的方式private String name;private Integer age;private Date birthday;public AccountServiceImpl(String name,Integer age,Date birthday){this.name = name;this.age = age;this.birthday = birthday;}public void saveAccount(){System.out.println("service中的saveAccount方法執行了。。。"+name+","+age+","+birthday);}}2.set方法注入:(更常用的方式)
? ? ? ? 涉及的標簽:property
? ? ? ? 出現的位置:bean標簽的內部
? ? ? ? 標簽的屬性
? ? ? ? ? ? name:用于指定注入時所調用的set方法名稱
? ? ? ? ? ? value:用于提供基本類型和String類型的數據
? ? ? ? ? ? ref:用于指定其他的bean類型數據。它指的就是在spring的Ioc核心容器中出現過的bean對象
? ? ? ? 優勢:
? ? ? ? ? ? 創建對象時沒有明確的限制,可以直接使用默認構造函數
? ? ? ? 弊端:
? ? ? ? ? ? 如果有某個成員必須有值,則獲取對象是有可能set方法沒有執行。
獲取的對象類要有對應的set方法
public class AccountServiceImpl2 implements IAccountService {//如果是經常變化的數據,并不適用于注入的方式private String name;private Integer age;private Date birthday;public void setName(String name) {this.name = name;}public void setAge(Integer age) {this.age = age;}public void setBirthday(Date birthday) {this.birthday = birthday;}public void saveAccount(){System.out.println("service中的saveAccount方法執行了。。。"+name+","+age+","+birthday);}}復雜類型的注入/集合類型的注入
? ? ? ? 用于給List結構集合注入的標簽:
? ? ? ? ? ? list array set
? ? ? ? 用于個Map結構集合注入的標簽:
? ? ? ? ? ? map ?props
? ? ? ? 結構相同,標簽可以互換
對應的類
public class AccountServiceImpl3 implements IAccountService {private String[] myStrs;private List<String> myList;private Set<String> mySet;private Map<String,String> myMap;private Properties myProps;public void setMyStrs(String[] myStrs) {this.myStrs = myStrs;}public void setMyList(List<String> myList) {this.myList = myList;}public void setMySet(Set<String> mySet) {this.mySet = mySet;}public void setMyMap(Map<String, String> myMap) {this.myMap = myMap;}public void setMyProps(Properties myProps) {this.myProps = myProps;}public void saveAccount(){System.out.println(Arrays.toString(myStrs));System.out.println(myList);System.out.println(mySet);System.out.println(myMap);System.out.println(myProps);}}3.基于注解的IOC與DI
學習基于注解的IoC配置,大家腦海里首先得有一個認知,即注解配置和xml配置要實現的功能都是一樣的,都是要降低程序間的耦合。只是配置的形式不一樣。 關于實際的開發中到底使用xml還是注解,每家公司有著不同的使用習慣。所以這兩種配置方式我們都需要掌握。
xml文件的配置
一定要告知spring在創建容器時要掃描的包(否則即使加了注解也白搭,包一定要掃對),配置所需要的標簽不是在beans的約束中,而是一個名稱為
? ? context名稱空間和約束中
常用注解
1.@Component
? ?@Component:
?* ? ? ? ? ?作用:用于把當前類對象存入spring容器中
?* ? ? ? ? ?屬性:
?* ? ? ? ? ? ? ?value:用于指定bean的id。當我們不寫時,它的默認值是當前類名,且首字母改小寫。
2.@Controller @Service @Repository
- ?@Controller:一般用在表現層
- ?@Service:一般用在業務層
- ?@Repository:一般用在持久層
以上三個注解他們的作用和屬性與Component是一模一樣。
他們三個是spring框架為我們提供明確的三層使用的注解,使我們的三層對象更加清晰
用于注入數據的(注解提供注入)
他們的作用就和在xml配置文件中的bean標簽中寫一個<property>標簽的作用是一樣的
1.@Autowired:
作用:自動按照類型注入。只要容器中有唯一的一個bean對象類型和要注入的變量類型匹配,就可以注入成功
- 如果ioc容器中沒有任何bean的類型和要注入的變量類型匹配,則報錯。
- 如果Ioc容器中有多個類型匹配時,會找與自己對應變量名稱相同的id,若沒有則報錯。
出現位置:
? ? ? ? ? ? 可以是變量上,也可以是方法上
?細節:
? ? ? ? ?在使用注解注入時,set方法就不是必須的了。
2.@Qualifier:(給類成員注入時需要配合Autowired使用)
作用:在按照類中注入的基礎之上再按照名稱注入。它在給類成員注入時不能單獨使用。但是在給方法參數注入時可以
屬性:
? ? ? ??value:用于指定注入bean的id。
3.@Resource:(作用等同于@Autowired+@Qualifier)
作用:直接按照bean的id注入。它可以獨立使用
屬性:
? ? ? ? ? ? name:用于指定bean的id。
以上三個注入都只能注入其他bean類型的數據,而基本類型和String類型無法使用上述注解實現。
另外,集合類型的注入只能通過XML來實現。
4.@Value:
作用:用于注入基本類型和String類型的數據
屬性:
? ? ? ? ? value:用于指定數據的值。它可以使用spring中SpEL(也就是spring的el表達式)
? ? ? ? ? SpEL的寫法:${表達式}
5.@Scope:(用于改變作用范圍的,他的作用就和在bean標簽中使用scope屬性實現的功能是一樣的)
?作用:用于指定bean的作用范圍
?屬性:
? ? ? ? ? ? value:指定范圍的取值。常用取值:singleton prototype
4.配置properties(掌握)
properties文件
jdbc.driverClass=com.mysql.jdbc.Driver jdbc.jdbcUrl=jdbc:mysql://localhost:3306/ee19_spring_day02 jdbc.user=root jdbc.password=1234?
spring配置
<!-- 加載配置文件 "classpath:"前綴表示 src下在配置文件之后通過 ${key} 獲得內容--><context:property-placeholder location="classpath:com/itheima/f_properties/jdbcInfo.properties"/><!-- 創建數據源 c3p0--><bean id="dataSourceId" class="com.mchange.v2.c3p0.ComboPooledDataSource"><property name="driverClass" value="${jdbc.driverClass}"></property><property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property><property name="user" value="${jdbc.user}"></property><property name="password" value="${jdbc.password}"></property></bean>?
?
總結
以上是生活随笔為你收集整理的java元婴期(18)----java进阶(spring(2)----DI(依赖注入)基于注解的IOC与DI配置properties)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java元婴期(17)----java进
- 下一篇: java元婴期(19)----java进