1. 程式人生 > >Spring類載入(註解方式)

Spring類載入(註解方式)

通過 Spring 註冊的類一共只有三種載入方式!

環境: 
spring-context 4.2.6 
jdk 7 
Eclipse Neon for j2ee

最簡單的配置

<?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"
    xmlns:mvc
="http://www.springframework.org/schema/mvc" 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-4.2.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd"
>
<!-- 掃描註解 --> <context:component-scan base-package="org.foo" /> </beans>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

入口方法:

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class SpringEntrance {
    public static void main(String[] args){
        ClassPathXmlApplicationContext resource = new
ClassPathXmlApplicationContext( new String[]{ "applicationContext.xml" }); } }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

專案結構:

src
└── main
   └── java
      ├── applicationContext.xml
      └── org
          └── foo
              ├── service
              │   ├── TestDemo.java
              │   └── Test.java
              └── SpringEntrance.java
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

單例+預載入(預設)

//專案一啟動就產生一個且僅一個例項,即單例。
//並且,通過 @Autowired 只能獲得這個單例。new Test()則不受單例限制
@Component
public class Test{

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

單例+懶載入

//專案啟動時不載入
//僅當 TestDemo 類的 @Autowired Test 被掃描到時,才生成 Test 類的一個且僅一個例項。
//並且,通過 @Autowired 只能獲得這個單例。new Test()則不受單例限制
@Lazy
@Component
public class Test{

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

  正確的載入時機

package org.foo.service;

import javax.annotation.PostConstruct;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class TestDemo {
//禁止使用 @Autowired 標籤載入 @Lazy 的類
//  @Autowired 
//  TestSingle testSingle;

    //通過 BeanFactory 介面建立例項
    @Autowired
    BeanFactory beanFactory;

    public void doSth(){
        //test 是 Test 類名首字母小寫!一定要首字母小寫!
        //只有執行到這裡 Test 類才被例項化,延遲載入成功
        TestSingle ts=(TestSingle) beanFactory.getBean("test");
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

  錯誤的載入時機:

//懶載入無效
//專案啟動時 TestDemo 被載入時,掃描 @Autowired 標籤,生成 Test 的單例
@Component
public class TestDemo{
    @Autowired // 專案啟動時,這裡就會建立 Test 的單例,Test 類的懶載入無效
    Test test; 
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

多例+懶載入(僅支援懶載入)

定義

//每個 @Autowired 生成一個例項,可以有多個例項
@Scope("prototype")
//@Lazy //無論加不加 @Lazy,被 @Scope("prototype") 修飾的類都會 懶載入。
@Component
public class Test{

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

呼叫:

package org.foo.service;

import javax.annotation.PostConstruct;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class TestDemo {
//禁止使用 @Autowired 標籤載入 @Lazy 的類
//  @Autowired 
//  TestSingle testSingle;

    //通過 BeanFactory 介面建立例項
    @Autowired
    BeanFactory beanFactory;

    public void doSth(){
        Test test = null;
        for(int i=0;i<10;i++) {
            //test 是 Test 類名首字母小寫!一定要首字母小寫!
            //只有執行到這裡 Test 類才被例項化,延遲載入成功
            test = (Test) beanFactory.getBean("test");
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

spring beanfactory類高階用法

  反射方式載入類

beanFactory.getBean(
            task.getHandler() + "UrlSpider", // 反射獲得子類
            AbstractUrlSpider.class ); // 返回父型別
  • 1
  • 2
  • 3

需要注意的問題

建構函式裡不支援 @Autowired 的例項

package org.foo.service;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class TestDemo {
    @Autowired
    BeanFactory beanFactory;

    public TestDemo (){
        beanFactory.getBean("test",Test.class);
    }
}

相關推薦

Spring載入註解方式

通過 Spring 註冊的類一共只有三種載入方式!環境: spring-context 4.2.6 jdk 7 Eclipse Neon for j2ee最簡單的配置<?xml version="

徹底搞懂Spring載入註解方式

目錄 通過 Spring 註冊的類一共只有三種載入方式! 環境: spring-context 4.2.6 jdk 7 Eclipse Neon for j2ee 最簡單的配置 <?xml version="1.0" e

Spring學習筆記】11 spring aop 程式設計註解方式

2018.5.25註解方式比較繁瑣不直觀,瞭解即可1.建立web專案2.引入jar包在原來jar包基礎上引入aop相關的jar包3.日誌檔案log4j.properties4.準備目標物件先建立介面再建立實現類package com.lu.spring.aop.service

spring的bean管理註解方式

elasticsearch1.Spring的Bean管理的中常用的註解@Component:組件.(作用在類上)public interface UserDao { public void sayHello(); } @Component(value="userDao")

Spring --13.Spring中AOP程式設計註解方式

1、基於註解AOP入門案例 1.2、建立工程引入依賴 pom.xml <dependencies> <dependency> <groupId>org.springframework</groupId&

Spring框架的AOP技術註解方式

1. 步驟一:建立JavaWEB專案,引入具體的開發的jar包 * 先引入Spring框架開發的基本開發包 * 再引入Spring框架的AOP的開發包 * spring的傳統AOP的開發的包 * spring-aop-4.2.4.RELEASE.jar

10 Spring框架的AOP技術註解方式

引入Spring框架開發的基本開發包,spring的傳統AOP的開發的包與aspectJ的開發包 建立spring配置檔案 applicationContext.xml <beans xmlns="http://www.springfra

spring事務的傳播屬性和事務隔離級別及配置事務註解方式

一、Propagation (事務的傳播屬性) Propagation :  key屬性確定代理應該給哪個方法增加事務行為。這樣的屬性最重要的部份是傳播行為。有以下選項可供使用:   PROPAGATION_REQUIRED--支援當前事務,如果當前沒有事務,就新建一個事務。這是最常見的選擇。 PROPAG

Spring學習5-Spring整合JDBC及其事務處理註解方式

  2、步驟二:使用JdbcTemplate類操作資料庫:     Spring把JDBC中重複的操作建立成了一個模板類:org.springframework.jdbc.core.JdbcTemplate。   A:要使用JdbcTemplate,需要為每一個DAO配置一個JdbcTemplate例項:  

Spring:依賴注入註解方式、泛型依賴注入

註解方式實現依賴注入支援手工裝配和自動裝配(慎用) 一般是宣告bean和bean直接的依賴關係的時候用比較好 使用註解方式時,也支援給Field注入值(在XML中不可以給Field注入)。另外就是setter方式注入。 @Resource註解在spring安裝目錄的lib\

spring boot + hibernate 多資料來源註解方式

一)spring boot  + hibernate 多資料來源(XML) import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.En

SpringMVC框架11.2 入門程式—處理器對映器和處理器介面卡註解方式

1.DispatcherServlet載入時會預設載入 DispatcherServlet.properties 檔案,目的是為了載入裡面的處理器對映器、處理器介面卡、檢視解析器等各個元件;(所以 springmvc.xml 中 兩種處理器介面卡、兩種處理器介面卡、檢視解析器都可以省略;)

[TensorFlow深度學習入門]實戰八·簡便方法實現TensorFlow模型引數儲存與載入pb方式

[TensorFlow深度學習入門]實戰八·簡便方法實現TensorFlow模型引數儲存與載入(pb方式) 在上篇博文中,我們探索了TensorFlow模型引數儲存與載入實現方法採用的是儲存ckpt的方式。這篇博文我們會使用儲存為pd格式檔案來實現。 首先,我會在上篇博文基礎上,實現由c

[TensorFlow深度學習入門]實戰七·簡便方法實現TensorFlow模型引數儲存與載入ckpt方式

[TensorFlow深度學習入門]實戰七·簡便方法實現TensorFlow模型引數儲存與載入(ckpt方式) TensorFlow模型訓練的好網路引數如果想重複高效利用,模型引數儲存與載入是必須掌握的模組。本文提供一種簡單容易理解的方式來實現上述功能。參考部落格地址 備註: 本文采用的

springboot學習筆記——整合mybatis註解方式

目錄 前言: 開發環境: 專案結構: 配置檔案:           資料庫表: 開始開發: 測試: 總結: 前言:           這一篇博文的延續上一篇的。只是使用mybatis的註解形式。相對來說註解形式和xml形式是

spring-AOP+自定義註解實現日誌管理註解方式實現

一、場景 後臺管理系統中,管理員作業系統時生成日誌儲存在資料庫中。 二、實現 1、jar包依賴 <!-- https://mvnrepository.com/artifact/org.springframework/spring-aop --> <dependency&

spring-mybatis MapperScannerConfigurer,註解方式 資料庫持久化四

主流方式 xml配置 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://ww

複習之spring基礎——Spring 的事務管理—配置AOP事務XML和註解方式

事務 事務邏輯上的一組操作,組成這組操作的各個邏輯單元,要麼一起成功,要麼一起失敗 事務的特性 原子性 :強調事務的不可分割. 一致性 :事務的執行的前後資料的完整性保持一致. 隔離性 :一個事務執行的過程中,不應該受到其他事務的干擾. 永續性 :事務一旦結束

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

spring aop實現類似代理中的方法註解實現

1.可以指定aop的執行次序 [email protected],可以攔截類上有@DataSource註解的類中的所有方法 [email protected]可以攔截有註解@DataSource的方法 4.兩者結合可以實現類似Spring註解