1. 程式人生 > >Spring註解驅動開發(一)

Spring註解驅動開發(一)

[email protected]註解 這個相當於配置檔案,即告訴spring這個一個配置類。

[email protected]
給容器註冊一個Bean;型別為返回值的型別,id預設是用方法名作為id.

@Configuration
public class MainConfig {
    @Bean
    public Person per(){
        return new Person("李四",22 );
    }
}

這個基本就相當於以前採用的xml配置檔案如下:

<bean id="per" class="com.learn.entity.Person"
> <property name="name" value="李四" /> <property name="age" value="22"/> </bean>

[email protected]
自動包掃描註解
value:指定要掃描的包
excludeFilters=Filter[] 指定掃描的時候按照什麼規則排除哪些元件。
includeFilters=Filter[] 指定掃描的時候只需要包含哪些元件。(注意的是包掃描預設的是掃描所有的,也就是use-default-filters=”true”,所以需要設定為false。 這個和配置檔案一樣)
FilterType.ANNOTATION :按照註解的方式
FilterType.ASSIGNABLE_TYPE:按照給定的型別
FilterType.CUSTOM:使用自定義規則。 使用這個需要是TypeFilter的實現類
FilterType.CUSTOM使用 案例如下:

package com.learn.config;

import java.io.IOException;

import org.springframework.core.io.Resource;
import org.springframework.core.type.AnnotationMetadata;
import org.springframework.core.type.ClassMetadata;
import org.springframework.core.type.classreading.MetadataReader;
import org.springframework.core.type.classreading.MetadataReaderFactory;
import
org.springframework.core.type.filter.TypeFilter; public class MyFilterCustom implements TypeFilter { /** * metadataReader 讀取到的當前正在掃描的類的資訊 * metadataReaderFactory 可以獲取到其它任何類的資訊 */ public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException { //獲取當前類註解的資訊 AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata(); //獲取當前正在掃描的類的資訊 ClassMetadata classMetadata = metadataReader.getClassMetadata(); //獲取當前類資源(類路徑) Resource resource = metadataReader.getResource(); String className = classMetadata.getClassName(); System.out.println("當前掃描的類的資訊"+className); if(className.contains("Controller")){ return true; } return false; } }
@Configuration
@ComponentScans(value={
        @ComponentScan(value="com.learn",
                includeFilters={
                        @Filter(type=FilterType.CUSTOM,classes={MyFilterCustom.class})
                        },useDefaultFilters=false)
})
public class MainConfig {
    @Bean
    public Person per(){
        return new Person("李四",22 );
    }
}

這裡寫圖片描述
FilterType.ASPECTJ:使用ASPECTJ表示式(基本用不到)
FilterType.REGEX :使用正則表示式

@Configuration
@ComponentScan(value="com.learn",
includeFilters={
        @Filter(type=FilterType.ANNOTATION,
                classes={Controller.class}
                )},useDefaultFilters=false)
public class MainConfig {
    @Bean
    public Person per(){
        return new Person("李四",22 );
    }
}

這個也基本相當於配置檔案:

<context:component-scan base-package="com.learn" use-default-filters="false">
     <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan> 

    <bean id="per" class="com.learn.entity.Person">
     <property name="name" value="李四" />
     <property name="age" value="22"/>
    </bean>

[email protected] 這個就是多個scan的幾個集合,也就是可以定義多個規則。 如果是jdk1.8以後的,本身也是可以多些幾次scan。 不用scans也可以

@Configuration
@ComponentScans(value={
        @ComponentScan(value="com.learn",
                includeFilters={
                        @Filter(type=FilterType.ANNOTATION,
                                classes={Controller.class}
                                )},useDefaultFilters=false)
})
public class MainConfig {
    @Bean
    public Person per(){
        return new Person("李四",22 );
    }
}

[email protected] 作用範圍

  • prototype 多例項的 備註:IOC容器啟動並不會去呼叫方法建立物件放在容器中,而是在每次獲取的時候才會呼叫方法建立物件,且每次建立的都是一個新的,即多例項。
  • singleton 單例項的(預設值) 備註:預設在單例項的情況下,IOC容器啟動的時候會呼叫方法建立物件,放入iOC容器中。 以後每次獲取就是從容器中拿,即物件都是一個。
  • request 同一次請求建立一個例項(web環境中才能用到,且基本不用)
  • session 同一個session建立一個例項(web環境中才能用到,且基本不用)

預設單列的情況:

@Configuration
public class MainConfig2 {
    @Bean
    public Person person(){
        return new Person("張三", 28);
    }
}
ApplicationContext context = new AnnotationConfigApplicationContext(MainConfig2.class);
        String[] beanDefinitionNames = context.getBeanDefinitionNames();

        for(String beanName:beanDefinitionNames){
            System.out.println("當前bean的名稱:"+beanName);
        }
        System.out.println("一共有"+context.getBeanDefinitionCount()+"個bean被定於了");
        Object obj1=context.getBean("person");
        Object obj2=context.getBean("person");
        System.out.println("obj1,obj2:"+(obj1==obj2));

這裡寫圖片描述

使用多例的情況:

@Configuration
public class MainConfig2 {
    @Bean
    @Scope("prototype")  //多例
    public Person person(){
        return new Person("張三", 28);
    }
}

這裡寫圖片描述

[email protected] 懶載入,針對單例項的bean
懶載入:容器啟動不建立物件。第一次使用(獲取bean)建立的物件,並初始化。

@Configuration
public class MainConfig2 {
    @Bean
    @Lazy
    public Person person(){
        System.out.println("呼叫了person方法");
        return new Person("張三", 28);
    }
}
ApplicationContext context = new AnnotationConfigApplicationContext(MainConfig2.class);
        String[] beanDefinitionNames = context.getBeanDefinitionNames();

        for(String beanName:beanDefinitionNames){
            System.out.println("當前bean的名稱:"+beanName);
        }
        System.out.println("一共有"+context.getBeanDefinitionCount()+"個bean被定於了");

        System.out.println("-------IOC容器初始化完成,開始呼叫bean----");
        Object obj1=context.getBean("person");
        Object obj2=context.getBean("person");
        System.out.println("obj1,obj2:"+(obj1==obj2));

這裡寫圖片描述

[email protected] 按照一定的條件進行判斷,滿足條件給容器中註冊bean。

@Configuration
public class MainConfig2 {

    @Bean("win")
    @Conditional(WindowConditional.class)
    public Person person1(){
        return new Person("Windows", 70);
    }
    @Bean("Lin")
    @Conditional(LinuxConditional.class)
    public Person person2(){
        return new Person("Linux", 80);
    }

}
/***
 * 是否是linux環境
 * @author SpringLi
 *
 */
public class LinuxConditional implements Condition{
    /**
     * ConditionContext  判斷條件能使用的上下文
     * AnnotatedTypeMetadata 註釋資訊
     */
    public boolean matches(ConditionContext context,
            AnnotatedTypeMetadata metadata) {
        //能獲取到IOC使用的beanFactory
        ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
        //獲取類載入器
        ResourceLoader resourceLoader = context.getResourceLoader();
        //獲取當前環境資訊
        Environment environment = context.getEnvironment();
        //獲取bean定義的註冊類
        BeanDefinitionRegistry registry = context.getRegistry();
        String property = environment.getProperty("os.name");
        if(property.contains("Linux")){
            return true;
        }
        return false;
    }
}
public class WindowConditional implements Condition{
    /**
     * ConditionContext  判斷條件能使用的上下文
     * AnnotatedTypeMetadata 註釋資訊
     */
    public boolean matches(ConditionContext context,
            AnnotatedTypeMetadata metadata) {
        //能獲取到IOC使用的beanFactory
        ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
        //獲取類載入器
        ResourceLoader resourceLoader = context.getResourceLoader();
        //獲取當前環境資訊
        Environment environment = context.getEnvironment();
        //獲取bean定義的註冊類
        BeanDefinitionRegistry registry = context.getRegistry();
        String property = environment.getProperty("os.name");
        if(property.contains("Window")){
            return true;
        }
        return false;
    }
}
ApplicationContext context = new AnnotationConfigApplicationContext(MainConfig2.class);
        String[] beanDefinitionNames = context.getBeanDefinitionNames();

        for(String beanName:beanDefinitionNames){
            System.out.println("當前bean的名稱:"+beanName);
        }
        System.out.println("一共有"+context.getBeanDefinitionCount()+"個bean被定於了");

這裡寫圖片描述

相關推薦

Spring註解驅動開發

[email protected]註解 這個相當於配置檔案,即告訴spring這個一個配置類。 [email protected] 給容器註冊一個Bean;型別為返回值的型別,id預設是用方法名作為id. @Configurat

Spring註解驅動開發

AOP-AOP功能測試 /** * 切面類 * @author lfy * * @Aspect: 告訴Spring當前類是一個切面類 * */ @Aspect public class LogAspects { //抽取公共的切入點表示式 //1、本

Linux USB 驅動開發—— USB裝置基礎概念

Linux USB 驅動開發(一)—— USB裝置基礎概念           在終端使用者看來,USB裝置為主機提供了多種多樣的附加功能,如檔案傳輸,聲音播放等,但對USB主機來說,它與所有USB裝置的介面都是一致的。一個USB裝置由3個功

Spring Boot2--Web開發

Web開發的核心內容主要包括內嵌Servlet容器和Spring MVC。 Spring Boot提供了spring-boot-starter-web為Web開發予以支援,spring-boot-starter-web為我們提供了嵌入的Tomcat以及Spring MVC的

ALSA 驅動框架和驅動開發

音訊裝置介面包括PCM IIS AC97三大類 兩種音訊驅動框架: ALSA 和 OSS OSS包含DSP和MIXER字元裝置介面,完全使用檔案操作 ALSA以CARD和元件(PCM,mixer等)為主線,在使用者空間的變成中不適用檔案介面,而是使用alsalib,而下文要

Linux 下wifi 驅動開發—— WiFi基礎知識解析

 一、WiFi相關基礎概念 1、什麼是wifi        我們看一下百度百科是如何定義的:       Wi-Fi是一種可以將個人電腦、手持裝置(如pad、手機)等終端以無線方式互相連線的技術,事實上它是一個高頻無線電訊號。[1]  無線保真是一個無線網路通訊技術的品牌

Spring 註解學習手札 構建簡單Web應用

轉載自 http://snowolf.iteye.com/blog/577989 我們將用到如下jar包:  引用 aopalliance-1.0.jar  commons-logging-1.1.1.jar  log4j-1.2.15.ja

嵌入式Linux裝置驅動開發

裝置驅動開發是Linux開發領域一個非常重要的部分,在Linux原始碼的85%都是驅動程式的程式碼。裝置驅動開發不僅需要了解硬體底層的知識,還需要擁有作業系統的背景。驅動程式追求的是高效,穩定,驅動程式發生的問題有可能直接導致整個系統的崩潰。 驅動程式不主動執

Exynos4412 中斷驅動開發—— 中斷基礎及中斷的註冊過程

一、中斷基礎概念         所謂中斷,指CPU在執行程式的過程中,出現了某些突發事件即待處理,CPU必須暫停當前的程式。轉去處理突發事件,處理完畢後CPU又返回原程式被中斷的位置並繼續執行。 1、中斷分類 a -- 內部中斷和外部中斷       根據中斷的的來源,中

Spring註解學習手札構建web應用

近來工作發生了一些變化,有必要學習一下Spring註解了! 網上找了一些個例子,總的說來比較土,大多數是轉載摘抄,按照提示弄下來根本都執行不了,索性自己趟一遍這渾水,在這裡留下些個印記。 這次,先來構建一個極為簡單的web應用,從controller到dao。不考慮具體實現

嵌入式Linux——nand flash 驅動開發:硬體介紹

本文章講nand flash的驅動開發,而在介紹驅動程式之前我想先介紹一下我所用的硬體。這樣對程式的開發更為方便。本文所使用的nand flash晶片為K9F2G08U0C,下面是他的一些必要的特性:

嵌入式Linux驅動開發一個簡單的Linux核心模組框架

#include <linux/init.h> #include <linux/kernel.h> #include <linux/module.h> static

[Windows驅動開發]VS2008搭建windows驅動編譯環境

開發windows驅動的第一步當然是要學會如何編譯windows驅動程式。 編譯windows程式的方式大約有以下幾種:     ● WDK提供的Build Environments: 微軟官方推薦使用WDK提供的Build Environments來對相應系統

spring註解開發 bean的註冊

通過註解注入bean: 實體類: 執行結果 @ComponentScans  使用: value:配置掃描的包路徑,spring會掃描這個包及其子包,也是預設情況 @Filter:配置過濾器, 設定過濾器型別,預設註解型別

步實現Spring4 + Hibernate4 + Freemarker2 的註解驅動開發二.應用配置

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:mvc="http://www.springframework.or

Spring第二天:Spring的IOC的註解方式、Spring的AOP開發XML

   Spring第二天繼續,今天要學習的是Spring的IOC的註解方式和Spring的AOP開發(XML) 目錄 1.Spring的IOC註解方式開發 1.1Spring的IOC註解開發入門 1.1.1建立Web專案引入Jar包 1.1.2引入Spri

微信小程式開發——使用sshstruts2+hibernate+spring框架實現後臺與微信前臺進行通訊

使用ssh框架實現對微信小程式前臺的通訊,做到前後臺分離,後臺頁面都為靜態頁面,通過用json來現實與前臺通訊(面向介面程式設計)。在這次因為只為了實現通訊所以沒有用hibernate。只用了struts2+spring,也是ssh框架中struts和spring整合。實現了

spring schedule定時任務註解的方式

我所知道的java定時任務的幾種常用方式: 1、spring schedule註解的方式; 2、spring schedule配置檔案的方式; 3、java類繼承TimerTask; 第一種方式的

嵌入式開發之編寫設備驅動程序

循環 挑戰 重要 同時 地址空間 百萬 發的 隨著 新的   前面談到有關驅動程序的相關簡述,寫了什麽是驅動程序,以及驅動程序在嵌入式開發中占據的重要地位。同時也簡要分析了驅動程序開發所面臨的挑戰。接下來談談如何來完成驅動程序的編寫。   這裏有以下幾個問題:  

Spring註解驅動開發】如何使用@Bean註解指定初始化和銷燬的方法?看這篇就夠了!!

## 寫在前面 > 在【[String註解驅動開發專題](https://www.cnblogs.com/binghe001/category/1780611.html)】中,前面的文章我們主要講了有關於如何向Spring容器中註冊bean的知識,大家可以到【[String註解驅動開發專題](http