1. 程式人生 > >Spring-基於Java類的配置

Spring-基於Java類的配置

概述

JavaConfig是Spring的一個子專案,它旨在通過Java類的方式提供Bean的定義資訊,在Spring4.0的版本,JavaConfig正式成為Spring4.0的核心功能。

使用Java類提供Bean定義資訊

普通的POJO只要標註了@Configuration註解,就可以為Spring容器提供Bean定義的資訊,每個標註了@Bean的類方法都相當於提供一個Bean的定義資訊。

例項

這裡寫圖片描述

POJO

package com.xgj.ioc.javaConfig;

import org.springframework.context.annotation.Bean;
import
org.springframework.context.annotation.Configuration; // 將一個POJO標註為定義Bean的配置類 @Configuration public class Teacher { /** * * * @Title: studentOne * * @Description: 定義了一個Bean,並提供了Bean的例項化邏輯 * * @return * * @return: StudentOne */ @Bean public
StudentOne studentOne() { return new StudentOne(); } /** * * * @Title: studentTwo * * @Description: 定義了一個Bean,並提供了Bean的例項化邏輯 * * @return * * @return: StudentTwo */ @Bean public StudentTwo studentTwo() { return new
StudentTwo(); } public void arrangeStudent() { studentOne().doCleanWork(); studentTwo().doHomeWork(); } }
package com.xgj.ioc.javaConfig;

public class StudentOne {

    public void doCleanWork() {
        System.out.println("StudentOne will do CleanWork");
    }
}
package com.xgj.ioc.javaConfig;

public class StudentTwo {
    public void doHomeWork() {
        System.out.println("StudentTwo will do HomeWork");
    }
}

測試類

package com.xgj.ioc.javaConfig;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class JavaConfigTest {

    public static void main(String[] args) {
        ApplicationContext ctx = new AnnotationConfigApplicationContext(
                Teacher.class);
        ctx.getBean("teacher", Teacher.class).arrangeStudent();
    }
}

執行結果

這裡寫圖片描述

分析

Teacher類的定義出標註了@Configuration註解,說明這個類可以用於為Spring提供Bean的定義資訊。
該類的方法可以標註@Bean註解,Bean的型別由方法返回值的型別決定,名稱預設和方法名同名,當然也可以通過入參顯示指定Bean名稱,比如@Bean(name=”coolStudent”).
@Bean所標註的方法體提供了Bean的例項化邏輯。

studentOne()和studentTwo()方法分別定義了一個StudentOne 和 StudentTwo型別的Bean, 他們的Bean名稱分別為 studentOne 和 studentTwo。

在arrangeStudent()方法中 注入了上面例項化的兩個Bean。

以上配置和下面的xml是等效的

<bean id="studentOne" class="com.xgj.ioc.javaConfig.StudentOne"/>
<bean id="studentTwo" class="com.xgj.ioc.javaConfig.StudentTwo"/>
<bean id="teacher" class="com.xgj.ioc.javaConfig.Teacher"
p:sutdentOne-ref="studentOne" p:studentTwo-ref="studentTwo"/>

基於Java類的配置方式和基於XML或者基於註解的配置方式相比,前者通過程式碼程式設計的方式可以更加靈活的實現Bean的例項化及Bean之間的裝配,後兩者都是通過配置宣告的方式,在靈活性上要稍遜一些,但在配置上要更簡單一些。

使用基於Java類的配置資訊啟動Spring容器

1.直接通過@Configuration啟動Spring容器

Spring提供了AnnotationConfigApplicationContext類,它能夠直接通過標註@Configuration的Java類啟動Spring容器。

通過AnnotationConfigApplicationContext的建構函式載入配置類

比如我們上面的那個例子的測試類

package com.xgj.ioc.javaConfig;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class JavaConfigTest {

    public static void main(String[] args) {
        // (1)通過建構函式載入配置類       
        ApplicationContext ctx = new AnnotationConfigApplicationContext(
                Teacher.class);
        ctx.getBean("teacher", Teacher.class).arrangeStudent();
    }
}

在(1)處,通過AnnotationConfigApplicationContext類的建構函式直接傳入標註了@Configuration的JAVA類,這屆用該類中提供的Bean定義資訊啟動Spring容器。

通過編碼的方式載入多個@Configuration配置類,然後通過重新整理容器應用這些配置類

package com.xgj.ioc.javaConfig;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class JavaConfigTest {

    public static void main(String[] args) {
        // 通過建構函式載入配置類
        // ApplicationContext ctx = new AnnotationConfigApplicationContext(
        // Teacher.class);

        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
        // 註冊@Configuration的配置類,可註冊多個
        ctx.register(Teacher.class);
        // 重新整理容器以應用這些註冊的配置類
        ctx.refresh();

        Teacher teacher = ctx.getBean("teacher", Teacher.class);
        teacher.arrangeStudent();

    }
}

通過@Import將多個配置類組裝到一個配置類中,然後僅需註冊這個組裝好的配置類 ,啟動容器

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

@Configuration
@Import(DaoConfig.class)
public class ServiceConfig {

    @Autowired
    private DaoConfig daoConfig;

    @Bean
    public LogonService logonService(){
        LogonService logonService = new LogonService();
        System.out.println(daoConfig.logDao() == daoConfig.logDao());
        logonService.setLogDao(daoConfig.logDao());
        logonService.setUserDao(daoConfig.userDao());
        return logonService;
    }
}

AnnotationConfigApplicationContext的主要方法
這裡寫圖片描述

2.通過XML配置檔案引用@Configuration配置

標註了@Configuration的配置類和標註了@Component的類一樣也是一個Bean, 同樣的 它也可以被Spring的<context:component-scan>掃描到。 因此如果希望將配置類組裝到XML的配置檔案中,通過XML的配置檔案啟動Spring,這僅需要在XML子中通過<context:component-scan>掃描到相應的配置類即可。

我們改造下上面的測試類

這裡寫圖片描述

增加配置檔案:

<?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/beans 
            http://www.springframework.org/schema/beans/spring-beans.xsd

            http://www.springframework.org/schema/context 
            http://www.springframework.org/schema/context/spring-context.xsd">


    <!-- (1)宣告Context名稱空間以及Schema檔案 (2)掃描類包以及應用註解定義的bean  resource-pattern 看需求,可配置可不配置 -->
    <context:component-scan base-package="com.xgj.ioc.javaConfig"
        resource-pattern="Teacher.class" />

</beans>
package com.xgj.ioc.javaConfig;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class JavaConfigTest {

    public static void main(String[] args) {

    ApplicationContext ctx = new ClassPathXmlApplicationContext(
                "classpath:com/xgj/ioc/javaConfig/beans.xml");

        Teacher teacher = ctx.getBean("teacher", Teacher.class);
        teacher.arrangeStudent();

    }
}

同樣也可以正確的載入並例項化Bean

2017-07-31 22:03:02,093  INFO [main] (AbstractApplicationContext.java:583) - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@d167d36: startup date [Mon Jul 31 22:03:02 BOT 2017]; root of context hierarchy
2017-07-31 22:03:02,176  INFO [main] (XmlBeanDefinitionReader.java:317) - Loading XML bean definitions from class path resource [com/xgj/ioc/javaConfig/beans.xml]
StudentOne will do CleanWork
StudentTwo will do HomeWork

3.通過@Configuration配置類引用XML配置資訊

假設bean中有兩個Bean ,如下

<bean id="userDao" class="com.xgj.ioc.javaConfig.UserDao"/>
<bean id="logDao" class="com.xgj.ioc.javaConfig.LogDao"/>

在@Configuration配置類中可以直接通過@ImportResource引入XML的配置那檔案,這樣就就可以直接通過@Autowired引用xml配置檔案中定義的Bean。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource;

@Configuration
@ImportResource("classpath:com/xgj/ioc/javaConfig/beans.xml")
public class LogonAppConfig {

    @Bean
    @Autowired
    public LogonService logonService(UserDao userDao,LogDao logDao){
        LogonService logonService = new LogonService();
        logonService.setUserDao(userDao);
        logonService.setLogDao(logDao);
        return logonService;        
    }
}

通過@ImportResource引入XML配置檔案
通過@Bean定義一個LogonService 的bean
通過@Autowired自動注入userDao和logDao ,這兩個Bean是在XML配置檔案中定義的。

需要說明的是,@ImportResource引入XML配置檔案,不是@Autowired處可成功注入到對應Bean的前提條件。 只要不同形式的Bean定義資訊能夠載入到Spring容器中,Spring就可以智慧的完成Bean之間的裝配。

相關推薦

Spring基於Java配置Bean(四):通過@Configuration配置引用xml配置資訊

總結:在@Configuration配置類中,通過@ImportResource就可以引入xml配置檔案,在配置類中可直接通過@AutoWired引用xml檔案中定義的bean。(1)XML配置檔案<?xml version="1.0" encoding="UTF-8"

Spring-基於Java配置

概述 JavaConfig是Spring的一個子專案,它旨在通過Java類的方式提供Bean的定義資訊,在Spring4.0的版本,JavaConfig正式成為Spring4.0的核心功能。 使用Java類提供Bean定義資訊 普通的P

Spring問題集:@value放在Spring基於java配置檔案中取不到值

在測試Spring的事務的時候需要連線資料庫,但是發現@Value的值一直就是“{${jdbc.url}}”,並沒有從配置檔案中獲取到值, 配置檔案的程式碼如下: @Configuration @ComponentScan(basePackages =

Spring學習6(6)基於java,Groovy,編碼的方式對Bean進行配置

Spring學習6(6) 基於Java類的配置 使用Java類提供Bean的定義資訊  普通的PoJo只要標註了@Configuration註解就可以為Spring容器提供Bean的定義資訊,每個標註了@Bean的方法都相當於提供了一個Bean的定義資訊程式碼如

spring security oauth2 jwt 認證和資源分離的配置文件(java配置版)

boot cond lan 資源分離 測試 sql adapter 依賴 註入 最近再學習spring security oauth2。下載了官方的例子sparklr2和tonr2進行學習。但是例子裏包含的東西太多,不知道最簡單最主要的配置有哪些。所以決定自己嘗試搭建簡單版

Spring基於Java配置@Configuration和@Bean用法

Spring中為了減少xml中配置,可以宣告一個配置類(例如SpringConfig)來對bean進行配置。 一、首先,需要xml中進行少量的配置來啟動Java配置: <?xml version="1.0" encoding="UTF-8"?> <bea

spring基於java配置@Configuration和@Bean用法【程式碼示例】

public class MyDriverManager { public MyDriverManager(String url,String userName,String passwo

碼農小汪-spring框架學習之9-基於 Java配置元資料 @ImportResource

基於 Java 的配置元資料 Spring 新功能 Java-cofiguration 支援@Configuration 類註解和@Bean 方法註解@Bean 註解用於表明一個方法將會例項化、配置、初始化一個新物件,該物件由Spring IoC 容器管理。大

9.Spring——基於註解的配置

元素 5.1 註解註入 視圖 col result ins ini llc 1.簡介 2.@Required 註釋 3.@Autowired 註釋 4.@Qualifier 註釋 5.JSR-250 註釋   5.1@PostConstruct 和 @PreDes

DES加密演算法的java實現(基於java庫)

嗯嗯........這個是我新開的部落格上的第一篇的文章,這裡小白希望自己的技術能夠一天比一天好(p≧w≦q),加油! 好吧,現在來一個基於java類庫的DES加密演算法的實現吧~網上不少的程式碼要不執行有問題,要不就是簡簡單單內建一個固定的加密字串就簡單完事了。好吧,我承認我現在是為懶人服務

基於java庫的3DES加密演算法實現

別看3DES的程式碼很複雜,其實和DES程式碼一樣,核心程式碼就那麼幾行 加密部分的核心 Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding"); cipher.init(Cipher.E

Spring基於XML方式配置事務

配置步驟 ###一、配置事務管理器### 在Bean配置檔案中配置事務管理器。 需要注入資料來源。 舉個例子: <!-- 配置事務管理器 --> <bean id="transactionManager" class="org.sprin

Spring 基於註解的配置

基於註解的配置 從 Spring 2.5 開始就可以使用註解來配置依賴注入。而不是採用 XML 來描述一個 bean 連線,你可以使用相關類,方法或欄位宣告的註解,將 bean 配置移動到元件類本身。 在 XML 注入之前進行註解注入,因此後者的配置將通過兩種方式的屬性連

SIA實戰(二):不用XML,使用java配置Bean

如果你已經厭煩使用XML配置Spring Bean,那麼你可以嘗試使用普通的java類來配置bean,這樣避免了XML中字串導致的錯誤,讓異常從執行期提前到了編譯器 以下是基於java配置bean的詳細過程,文章的最後附上原始碼 1.首先配置元件掃描器,

Spring 基於註解的配置(二)(@Required,@Autowired, @Qualifier)

@Required 應用範圍:bean屬性的setter方法 作用:檢查註解的Bean屬性是否在XML中進行配置,若未進行配置則容器會丟擲一個BeanInitializationException異常 使用方法: 方法一: 包函 <context:annotatio

Spring——基於註解的配置

Spring註解配置 從 Spring 2.5 開始就可以使用註解來配置依賴注入。使用註解的方式使我們無需在XML中配置一個Bean引用,更加簡單和方便。 註解配置預設情況下在Spring中是關閉的,我們需要在配置檔案中使用<context:annot

基於java庫的DES加密演算法實現

真正的核心程式碼就是呼叫java類庫實現的那部分 加密部分核心程式碼 //Cipher物件實際完成加密操作 Cipher cipher = Cipher.getInstance("DES"); //用密匙初始化Cipher物件,ENCRYPT_MODE用於

SpringMVC 通過java配置(不通過web.xml和xml 配置檔案方式)

介紹:springMVC 常用的配置方式是在web.xml 中配置dispatcherservlet 和 ContextConfigLocation 和一些攔截器,然後或是配置applicationContext-mvc.xml 然後在controller 等類中加上註解的方

Spring基於註解@Required配置

基於註解的配置 從 Spring 2.5 開始就可以使用註解來配置依賴注入。而不是採用 XML 來描述一個 bean 連線,你可以使用相關類,方法或欄位宣告的註解,將 bean 配置移動到元件類本身。 在 XML 注入之前進行註解注入,因此後者的配置將通過兩種方式的屬性連線被前者重寫。 註解連線在預設情況下在

Spring使用Hibernate和再加SpringData時配置的差別基於Java配置

.sh for packages bean java配置 gem springmvc nbsp mod 只使用Spring+Hibernate 配置DataSource、LocalSessionFactoryBean、HibernateTransactionManager