日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java元婴期(18)----java进阶(spring(2)----DI(依赖注入)基于注解的IOC与DI配置properties)

發布時間:2025/3/21 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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對象的實例化方式,使我們在創建對象時,如果用不到這些數據,也必須提供。

<bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl"><constructor-arg name="name" value="泰斯特"></constructor-arg><constructor-arg name="age" value="18"></constructor-arg><constructor-arg name="birthday" ref="now"></constructor-arg></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方法沒有執行。

<bean id="accountService2" class="com.itheima.service.impl.AccountServiceImpl2"><property name="name" value="TEST" ></property><property name="age" value="21"></property><property name="birthday" ref="now"></property></bean>

獲取的對象類要有對應的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
? ? ? ? 結構相同,標簽可以互換

<bean id="accountService3" class="com.itheima.service.impl.AccountServiceImpl3"><property name="myStrs"><set><value>AAA</value><value>BBB</value><value>CCC</value></set></property><property name="myList"><array><value>AAA</value><value>BBB</value><value>CCC</value></array></property><property name="mySet"><list><value>AAA</value><value>BBB</value><value>CCC</value></list></property><property name="myMap"><props><prop key="testC">ccc</prop><prop key="testD">ddd</prop></props></property><property name="myProps"><map><entry key="testA" value="aaa"></entry><entry key="testB"><value>BBB</value></entry></map></property></bean>

對應的類

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名稱空間和約束中

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><!--告知spring在創建容器時要掃描的包,配置所需要的標簽不是在beans的約束中,而是一個名稱為context名稱空間和約束中--><context:component-scan base-package="com.itheima"></context:component-scan> </beans>

常用注解

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)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。