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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring中的Bean配置、属性配置、装配内容详细叙述

發布時間:2023/12/3 javascript 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring中的Bean配置、属性配置、装配内容详细叙述 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 1、Bean的配置
    • 1.1、配置方式
  • 2、Bean的實例化
    • 2.1、構造器實例化
    • 2.2、靜態工廠方式實例化
    • 2.3、實例工廠方式實例化
  • 3、Bean的作用域
    • 3.1、作用域的種類
  • 4、Bean的生命周期
  • 5、Bean的裝配方式
    • 5.1、基于XML的裝配
    • 5.2、基于Annotation的裝配
    • 5.3、自動裝配

1、Bean的配置

1.1、配置方式

  • 基于xml文件
  • Properties文件
  • 在實際開發中,最常使用的是XMl格式的配置方式!

    2、Bean的實例化

    實例化Bean的方式有三種:

  • 構造器實例化
  • 靜態工廠實例化
  • 實例工廠實例化
  • 2.1、構造器實例化

    構造器實例化是指Spring容器通過Bean對應類中默認的無參構造方法來實例化Bean。

    默認的無參構造方法來實例化Bean

    package com.nynu.qdy.instance.constructor; public class Bean1 { } <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd"><bean id="bean1" class="com.nynu.qdy.instance.constructor.Bean1" /></beans>

    2.2、靜態工廠方式實例化

    使用靜態工廠要求創建一個靜態工廠的方法來創建Bean的實例,其Bean配置中的class屬性所指定的不再是Bean實例的實現類,而是靜態工廠類,同時還需要使用factory-method屬性來指定所創建的靜態工廠方法。

    建一個靜態工廠的方法來創建Bean的實例

    package com.nynu.qdy.instance.static_factory;public class MyBean2Factory {// 使用自己的工廠建立Bean2實例public static Bean2 createBean() {return new Bean2();} } <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd"><!-- 靜態工廠方式實例化Bean:class:指向靜態工廠的全類名factory-method:需要調用的靜態工廠方法名--><bean id="bean2"class="com.nynu.qdy.instance.static_factory.MyBean2Factory"factory-method="createBean" ></bean></beans>

    2.3、實例工廠方式實例化

    此種方式的工廠類中,不再使用靜態方法創建Bean實例,而是采用直接創建Bean實例的方式。同時,在配置文件中,需要實例化的Bean也不是通過class屬性直接指向的實例化類,而是通過factory-bean屬性指向配置的實例化工廠,然后使用factory-bean屬性確定使用工廠中的哪個方法。

    通過factory-bean屬性指向配置的實例化工廠

    package com.nynu.qdy.instance.factory;public class MyBean3Factory {public MyBean3Factory() {System.out.println("bean3工廠實例化");}// 創建Bean3實例的方法public Bean3 createBean() {return new Bean3();} } <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd"><!-- 配置工廠 --><bean id="myBean3Factory"class="com.nynu.qdy.instance.factory.MyBean3Factory"></bean><!-- 使用factory-bean屬性指向配置的實例工廠, 使用factory-method屬性確定使用工廠中的哪個方法 --><bean id="bean3" factory-bean="myBean3Factory"factory-method="createBean"></bean></beans>

    3、Bean的作用域

    3.1、作用域的種類

    通過Spring容器創建一個Bean的實例時,不僅可以完成Bean的實例化,還可以為Bean指定特定的作用域。bean的作用域默認都是單例的,但是可以通過scope[作用域]來設置。

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd"> <!-- scope:作用域--><bean id="scope" class="com.nynu.qdy.scope.Scope"scope="singleton"></bean><bean id="scope1" class="com.nynu.qdy.scope.Scope"scope="prototype"></bean></beans>

    4、Bean的生命周期

    Spring IOC容器對bean的生命周期的管理過程是:

  • 通過構造器或者工廠方法創建Bean實例
  • 設置Bean的屬性 調用Bean的初始化方法
  • 使用Bean
  • 關閉容器,調用Bean的銷毀方法
  • 5、Bean的裝配方式

    Bean的裝配方式:

    • 基于XML的裝配、
    • 基于注解的裝配(Annotation)、
    • 自動裝配、

    5.1、基于XML的裝配

    基于xml的裝配方式:

    • 設值注入(Setter Injection)
    • 構造注入(Constructor Injection)

    在Spring實例化Bean的過程中,Spring首先會調用Bean的默認構造方法來實例化Bean對象, 然后通過反射的方式調用setter方法來注入屬性值。因此,設值注入要求一一個 Bean必須滿足以下兩點要求。

    • Bean類必須提供一個默認的無參構造方法。
    • Bean類必須為需要注入的屬性提供對應的setter方法

    使用設值注入時, 在Spring配置文件中,需要使用元素的子元素來為每個屬性注入值;而使用構造注入時,在配置文件里,需要使用元素的子元素 來定義構造方法的參數,可以使用其value 屬性(或子元素)來設置該參數的值。

    下面通過一個案例來演示基于XML方式的Bean的裝配:

    1.編寫JavaBean

    package com.nynu.qdy.assemble;import java.util.List;public class User {private String username;private Integer password;private List<String> list;/* *由于使用構造注入,需要有其有參和無參的構造方法。同時,為了輸出時能夠看到結果,還重寫了其屬性的toString方法 *//** 1.使用構造注入 1.1提供帶所有參數的有參構造方法*/public User(String username, Integer password, List<String> list) {super();this.username = username;this.password = password;this.list = list;}/** 2.使用設值注入 2.1提供默認構造參數 2.2為所有屬性提供setter方法*/public User() {super();}public void setUsername(String username) {this.username = username;}public void setPassword(Integer password) {this.password = password;}public void setList(List<String> list) {this.list = list;}@Overridepublic String toString() {return "User [username=" + username + ", password=" + password + ", list=" + list + "]";} }

    2.編寫配置文件

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd"><!-- 1.使用構造注入方式裝配User實例:constructor-arg:用于定義構造方法的參數,index屬性:表示索引(從0開始)value屬性:用于設置注入的值list子元素:用于User來中對應的list集合屬性注入值--><bean id="user1" class="com.nynu.qdy.assemble.User"><constructor-arg index="0" value="tom"></constructor-arg><constructor-arg index="1" value="123456"></constructor-arg><constructor-arg index="2"><list><value>"constructorvalue1"</value><value>"constructorvalue2"</value></list></constructor-arg></bean><!-- 2.使用設值注入方式裝配User實例:property元素:用于調用Bean實例中的setter方法完成屬性賦值從而完成依賴注入lsit子元素:用于User來中對應的list集合屬性注入值--><bean id="user2" class="com.nynu.qdy.assemble.User"><property name="username" value="張三"></property><property name="password" value="654321"></property><!-- 注入list集合 --><property name="list"><list><value>"setlistvalue1"</value><value>"setlistvalue2"</value></list></property></bean> </beans>

    3.測試

    package com.nynu.qdy.assemble;import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;public class XmlBeanAssembleTest {@SuppressWarnings("resource")public static void main(String[] args) {// 定義配置文件路徑String xmlPath = "com/nynu/qdy/assemble/beans5.xml";// ApplicationContext在加載配置文件時,對Bean進行實例化ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);// 構造方式輸出結果System.out.println(applicationContext.getBean("user1"));// 設值方式輸出結果System.out.println(applicationContext.getBean("user2"));} }

    4.結果

    User [username=tom, password=123456, list=["constructorvalue1", "constructorvalue2"]] User [username=張三, password=654321, list=["setlistvalue1", "setlistvalue2"]]

    5.2、基于Annotation的裝配

    Spring中定義了一系列的注解,常用的注解如下所示。

    • @Component: 可以使用此注解描述Sping中的Ban.但它是個泛化的概念,僅僅表示一個組件(Bean),并且可以作用在任何層次。使用時只需將該注解標注在相應類上即可 。
    • @Repository:用于將數據訪問層(Dao層)的類表識為Spring中的Bean,其功能與@Component相同。
    • @Service:通常作用在業務層( Semice層),用于將業務層的類標識為Spring中的Bean,其功能與@Component相同。
    • @ Controller:通常作用在控制層(如Spring MVC的Controller).用于將控制層的類標識為Spring中的Bean,其功能與@Component相同。
    • @Autowired:用于對Bean的屬性變量、屬性的stter方法及構造方法進行標注,配合對應的注解處理器完成Been的自動配置工作。默認按照Bean的類型進行裝配。
    • @Resource:其作用與@Autowited-一樣。 其區別在于@Autowired默認按照Bean類型裝配,而@Resource默認按照Bean實例名稱進行裝配。@Resource 中有兩個重要屬性: name和type。Spring將name屬性解析為Bean實例名稱,type屬性解析為Bean實例類型。如果指定name屬性,則按實例名稱進行裝配;如果指定type屬性,則按Bean類型進行裝配;如果都不指定,則先按Bean實例名稱裝配,如果不能匹配,再按照Bean類型進行裝配;如果都無法匹配,則拋出NoSuchBeanDefintionException異常。
    • @Qulifier: 與@Autowired注解配合使用,會將默認的按Bean類型裝配修改為按Bean 的實例名稱裝配,Bean的實例名稱由@Qualifer注解的參數指定。

    下面通一個案例來演示如何通過這些注解來裝配Bean
    1.UserDao 接口

    package com.nynu.qdy.annotation;public interface UserDao {public void save(); }

    2.接口實現類

    package com.nynu.qdy.annotation;import org.springframework.stereotype.Repository;/** @Reposrtory:將UserDaoImpl類表示為Spring中的Bean* 相當于<bean id="userDao" class="com.nynu.qdy.annotation.UserDaoImpl"/>*/ @Repository("userDao") public class UserDaolmpl implements UserDao {public void save() {System.out.println("userdao...save....");} }

    3.UserService 接口

    package com.nynu.qdy.annotation;public interface UserService {public void save(); }

    4.UserServiceImpl實現類

    package com.nynu.qdy.annotation;import javax.annotation.Resource; import org.springframework.stereotype.Service;/** @Reposrtory:將UserServiceImpl類表示為Spring中的Bean* 相當于<bean id="UserService" * class="com.nynu.qdy.annotation.UserDaoServiceImpl"/>* @Resource:相當于配置文件中<property name="userDao" ref="userDao"/>*/ @Service("userService") public class UserServicelmpl implements UserService {@Resource(name = "userDao") private UserDao userDao;public void save() {// 調用userDao中的save方法this.userDao.save();System.out.println("userservice....save....");} }

    5.控制器類

    package com.nynu.qdy.annotation;import javax.annotation.Resource; import org.springframework.stereotype.Controller;/** @Controller:相當于在配置文件中編寫<bean id="userController"* class="com.nynu.qdy.annotation.UserController"/>* @Resource:相當于配置文件中編寫<property name="userService" ref="userService"/>*/ @Controller("userController") public class UserController {@Resource(name = "userService")private UserService userService;public void save() {this.userService.save();System.out.println("UserService...save....");}}

    6.配置文件beans.xml

    <?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/beanshttps://www.springframework.org/schema/beans/spring-beans-4.3.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context-4.3.xsd"><!-- 使用context命名空間,在配置文件中開啟相應的注解處理器 --><context:annotation-config /><!-- 分別定義3個Bean實例 --><bean id="userDao" class="com.nynu.qdy.annotation.UserDaolmpl" /><bean id="userService"class="com.nynu.qdy.annotation.UserServicelmpl" /><bean id="userController"class="com.nynu.qdy.annotation.UserController" /><!-- 使用context命名空間,通知Spring掃描指定包下的所有Bean類,進行注解解析 --><context:component-scanbase-package="com.nynu.qdy.annotation" /> </beans>

    7.測試類

    package com.nynu.qdy.annotation;import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;public class AnnotationAssembleTest {@SuppressWarnings("resource")public static void main(String[] args) {// 定義配置文件路徑String xmlPath = "com/nynu/qdy/annotation/beans6.xml";// 加載配置文件ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);// 獲取UserControllerUserController userController = (UserController) applicationContext.getBean("userController");// 調用UserController中save()方法userController.save();}}

    8.結果

    userdao...save.... userController....save.... UserService...save....

    9.提示

    上述案例中如果使用@Autowire注解替換@Resource注解,也可以達到同樣的效果。

    5.3、自動裝配

    Spring可以通過設置aotowrie的屬性來自動裝配Bean,所謂自動裝配,就是將一個Bean自動地裝配到其他Bean的Property中。

    名稱說明
    byName根據 Property 的 name 自動裝配,如果一個 Bean 的 name 和另一個 Bean 中的 Property 的 name 相同,則自動裝配這個 Bean 到 Property 中。
    byType根據 Property 的數據類型(Type)自動裝配,如果一個 Bean 的數據類型兼容另一個 Bean 中 Property 的數據類型,則自動裝配。
    constructor根據構造方法的參數的數據類型,進行 byType 模式的自動裝配。
    autodetect如果發現默認的構造方法,則用 constructor 模式,否則用 byType 模式。
    no默認情況下,不使用自動裝配,Bean 依賴必須通過 ref 元素定義。

    下面通過修改案例來演示使用自動裝配
    1.修改UserServiceImpl文件和UserController文件,分別在文件中增加類屬性的setter方法。
    2.修改beans.xml文件,添加autowire屬性

    <?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/beanshttps://www.springframework.org/schema/beans/spring-beans-4.3.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context-4.3.xsd"><!-- 使用context命名空間,在配置文件中開啟相應的注解處理器 --><context:annotation-config /><!-- 分別定義3個Bean實例 --><bean id="userDao" class="com.nynu.qdy.annotation.UserDaolmpl" /><bean id="userService"class="com.nynu.qdy.annotation.UserServicelmpl" autowire="byName"/><bean id="userController"class="com.nynu.qdy.annotation.UserController" autowire="byName"/><!-- 使用context命名空間,通知Spring掃描指定包下的所有Bean類,進行注解解析 --><context:component-scanbase-package="com.nynu.qdy.annotation" /> </beans>

    3.結果

    userdao...save.... userController....save.... UserService...save....

    4.提示
    使用 @Autowired 注解自動裝配Bean,使用@Autowired注解自動裝配具有類型兼容的單個Bean屬性。可以在構造器普通字段一切具有參數的方法上使用 @Autowired 注解。


    • @Autowired也可以用在數組上,Spring會將所有匹配的Bean自動裝配進數組。
    • @Autowired也可以用在集合上,Spring會判斷該集合的類型,然后自動裝配所有類型兼容的Bean。
    • @Autowired也可以用在Map上,若key為String類型,Spring將Bean的名稱作為key,Bean本身作為值自動裝配所有類型兼容的的Bean。

    也可以使用 @Resource 或 @Inject 自動裝配Bean,功能與 @Autowired 類似,建議使用@Autowired注解。

    創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

    總結

    以上是生活随笔為你收集整理的Spring中的Bean配置、属性配置、装配内容详细叙述的全部內容,希望文章能夠幫你解決所遇到的問題。

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