1. 程式人生 > >java 反射 模擬spring自動注入

java 反射 模擬spring自動注入

基於反射和註解機制,簡單模擬spring解析Autowired註解的過程。

1、自定義Autowired註解,程式碼如下

  1. package com.basic.reflect;  
  2. import java.lang.annotation.ElementType;    
  3. import java.lang.annotation.Retention;    
  4. import java.lang.annotation.RetentionPolicy;    
  5. import java.lang.annotation.Target;    
  6. @Retention(RetentionPolicy.RUNTIME)  
  7. @Target({ ElementType.FIELD, ElementType.METHOD })  
  8. public@interface Autowired {  
  9.     //註解的name屬性  
  10.     public String name() default"";    
  11. }  

2、定義相關的業務和Dao類,以及獲取Bean的容器(在容器中基於反射實現自動注入)

  1. publicclass PersonDao {  
  2.     publicint add(Object o) {  
  3.         System.out.println("dao autowird ok ");  
  4.         return0;  
  5.     }  
  6. }  
  7. publicclass ServiceImpl {  
  8.     @Autowired
  9.     private PersonDao personDao;  
  10.     publicint addPerson(Object obj) {  
  11.         return personDao.add(obj);  
  12.     }  
  13. }  
  14. publicclass BeanContainer {  
  15.     publicstatic Object getBean(String name) {  
  16.         try {  
  17.             Class<?> clazz = Class.forName("com.basic.reflect.ServiceImpl"
    );  
  18.             Object bean = clazz.newInstance();  
  19.             Field[] fileds = clazz.getDeclaredFields();  
  20.             for (Field f : fileds) {  
  21.                 if (f.isAnnotationPresent(Autowired.class)) {                          
  22.                     // 基於型別注入
  23.                     Class<?> c = f.getType();  
  24.                     Object value = c.newInstance();  
  25.                     //允許訪問private欄位  
  26.                     f.setAccessible(true);    
  27.                     //把引用物件注入屬性  
  28.                     f.set(bean, value);                            
  29.                 }  
  30.             }  
  31.             return bean;  
  32.         } catch (Exception e) {  
  33.             e.printStackTrace();  
  34.         }  
  35.         returnnull;  
  36.     }  
  37. }   

3、測試

  1. publicclass Test {  
  2.     publicstaticvoid main(String[] args) {  
  3.         ServiceImpl impl = (ServiceImpl) BeanContainer.getBean("service");  
  4.         String name = "test";  
  5.         impl.addPerson(name);  
  6.     }  
  7. }  

總結,上面的程式碼簡單模擬了Spring解析Autowired的過程,寫的比較簡單,但是精髓已經寫到了,主要就是利用反射機制生成例項並且解析註解對其屬性進行賦值。其實Spring框架的核心Ioc和Aop的實現,還是利用了Java最基本的東西,比如Aop就是利用了動態代理,Ioc就是利用了反射機制

相關推薦

java 反射 模擬spring自動注入

基於反射和註解機制,簡單模擬spring解析Autowired註解的過程。 1、自定義Autowired註解,程式碼如下 package com.basic.reflect;   import java.lang.annotation.ElementType; 

java 反射spring 自動注入原理

package com.xiaoqiang.user; public class User { private String username; private String mobile; public String getUsername() { retu

java反射導致spring自動注入失敗

這個地方困擾了我很久,一直沒有找到答案,網上的一些回答都只是小片段很是讓人為難,這裡記錄一下自己的解決方式,免得以後忘記。首先我的spring 的bean是我通過掃描包的方式來自動注入的(com.spring.service是我的包名)<context:componen

Java反射模擬Spring的Aop

1.    大概流程   上篇文章已經結合Java反射解釋了SpringAop的原理,這裡我們簡單模擬以下Spring的Aop實現。大體流程如下:   Ø  建立一個properties配置檔案模擬S

不同的包下有檔名相同的java類,spring自動注入會報錯

今天閒的蛋疼,做了一下spring自動注入的例子: 看看spring自動注入的是否可以區別出不同包下相同名字的java類,答案是不能,spring居然這麼渣。 整體結構圖如下: 1:首先建立兩個同名的java類和介面 com.a包下面有一個IAutoInject介面和實現

通過自定義註解和java反射實現Spring-DI依賴注入

依賴注入的原理就是簡單說就是從頭往下遞迴生成依賴物件的,然後對引用欄位賦值最後返回。 這裡實現通過變數型別來生成相應的物件。 模擬一個使用者的註冊業務,首先是controller層呼叫service層,然後呼叫dao層程式碼實現儲存使用者。 檔案結構: UserC

基於Java反射的map自動裝配JavaBean工具類設計

person urn exception map.entry ati test javabean 好的 declare 我們平時在用Myabtis時不是常常需要用map來傳遞參數,大體是如下的步驟: public List<Role> findRoles(M

模擬spring注入和讀取配置檔案(ApplicationContext.xml)

場景:使用者新增到資料庫中 傳統方式儲存例項3個問題: 1/改動資料儲存方式,如儲存到XML檔案中會造成程式變更 2/UserService無法在單例項情況下被重用,因為它的宣告在test.java中 3/UserService引用其它資源不便 pa

Java反射+註解實現自動持久化小例子(程式碼未優化)

需要實現的功能:根據實體類自動生成Sql語句與引數。 基本思路是:在實體類上標識註解,使用反射讀取註解然後拼接Sql語句。 哦了,開始研究程式碼~ 有請主人公註解:

spring 自動注入和 dubbo服務呼叫問題

今天 遇到這樣一個問題: 工程A中我寫寫了一個spring security的自定義認證類,這個類始終不能由容器管理,但是這個時候 我需要通過spring 自動注入某個服務類來獲取使用者相關資訊 來進行認證) 問題出現在: 自定義認證類不是由容器管

java反射spring中的應用

   1.為什麼要用反射?     根據物件可以得到該類的所有資訊,可以做直接操作物件不能做的事,它不是在編譯時執行,而是在執行時執行,也就是執行.class時執行,所以它可以做在編譯時不能做的事,像hibernate的屬性對映就是通過反射來賦值的,spring的bean的

spring自動注入之註解解析

spring的IOC主要做兩件事:建立bean和注入bean;相比較xml配置的方式使用標註自動注入比較簡單, 首先,建立bean的標註; @Component(不推薦使用)、 泛指元件,也就是所有需

Spring自動注入,利用註解實現spring基本配置詳解,Spring註解快速入門

Spring註解 1.準備工作 (1)匯入common-annotations.jar (2)匯入schema檔案 檔名為spring-context-3.0.3.RELEASE.jar (3)在xml的beans節點中配置 2.xml配置工作 <?xml

spring 自動注入Hibernate中的SessionFactory 探索

之前用Spring的註解模式配置Hibernate的時候覺得很簡單。 使用@autowire 自動注入 @Autowired private SessionFactory sessionFactory; 然後在方法中直接使用 Session session = sessionFact

java反射原理與Spring自動注入(轉載)

Java反射原理與Spring的自動注入 反射的定義 java的反射機制就是在執行狀態中, 對於任意一個類都能夠知道這個類的所有屬性和方法;對於任意一個物件,都能夠呼叫它的任意一個方法和屬性。這種動態獲取的資訊以及動態呼叫物件的方法的功能稱為java語言的反射機制。 Spi

java 反射呼叫Service導致Spring注入Dao失效

反射簡介    反射機制是在執行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;    對於任意一個物件,都能夠呼叫它的任意一個方法和屬性;這種動態獲取的資訊以及    動態呼叫物件的方法的功能稱為java語言的反射機制。

Spring 依賴注入實現原理--java反射和ASM框架

依賴注入是spring的一個特性,從配置層面解決了程式耦合、依賴問題,spring提供了建構函式依賴注入、Setter方法依賴注入、自動裝配依賴注入和@autowired註解依賴注入等多種實現方式。 那麼依賴注入是如何實現的?第一反應就是java反射唄,比如建構

通過反射途徑獲得的物件如何自動注入spring Bean

框架:spring+struts2 spring負責物件管理,MVC;自動裝配由struts2完成 (bean定義+getter/setter方法); 專案中用到了通過反射途徑呼叫相應的業務模組的邏輯。controller接收http請求後,根據請求引數獲得

Java反射生成物件注入spring(結合工廠模式)

利用工廠模式進行程式碼擴充套件,而不用修改原來程式碼。在配置檔案配置要生成的類,通過反射交由工廠生成物件,並將此物件交給spring管理,在專案中遇到此問題並予以解決,做一下記錄。 package cn.easted.edm.core.factory.da

利用java反射機制模擬spring IOC原理的實現

在Java中反射和動態代理機制很強大,通過反射機制在執行時獲取資訊。用於實現IOC。 代理是Java基本的設計模式,提供向物件插入額外的或不同的操作。Java的動態代理能動態的建立代理物件,以及動態的呼叫代理方法。用於實現AOP。一、Java反射機制1、作用 (1)在執行時判斷任意一個物件所屬的類; (