利用反射實現簡單的Spring注解注入實例


一時興起,這兩天看了看Spring的源代碼,就想寫一個簡單的Spring利用注解注入!!Spring的注解注入方式給了我們很方便的好處!大家應該都了解Spring的注入原理,在這里寫下一個非常簡單的使用注解來注入的實例,做個小小的筆記!

要使用注解,那就絕對和反射離不開。摘抄一段

Reflection是Java 程序開發語言的特征之一,它允許運行中的 Java 程序對自身進行檢查,或者說"自審",並能直接操作程序的內部屬性。例如,使用它能獲得 Java 類中各成員的名稱並顯示出來。 Java 的這一能力在實際應用中也許用得不是很多,但是在其它的程序設計語言中根本就不存在這一特性。例如,Pascal、C 或者 C++ 中就沒有辦法在程序中獲得函數定義相關的信息

有了反射才能讓我們的注解使用得更加的靈活

先來看一個判斷該類是否可以用我們的注解的判斷注解,就好像類似SpringMVC的@controller

package org.xie.annotation.device;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
 * 用來判斷該類是否可以用來使用注入
 * @author 騷年、編程去
 *
 */
@Target(ElementType.TYPE)
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface IsAnnotation {
	

}

然后就是我們要用到的注解了

package org.xie.annotation.device;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface SetterAnnotation {
	//自定義注解
	public Class nation() ;  
}
這個注解里面返回了一個Class對象,在這里我們並沒有像spring那樣通過自定義的名字來注入,而是通過該類的類型直接注入,都說了。。。。是一個小例子

然后就是我們要用到的接口了

package org.xie.Interface;

public interface IUser {

	
	
	void login();
}


以及兩個實現類

首先是Chinese

package org.xie.Interface.impl;

import org.xie.Interface.IUser;

public class ChineseUserImpl implements IUser{

	
	
	public void login() {
		
		System.out.println("注入中文");
		
		
	};
}

然后是English

package org.xie.Interface.impl;

import org.xie.Interface.IUser;

public class EnglishUserImpl implements IUser {

	@Override
	public void login() {
		// TODO Auto-generated method stub
		System.out.println("English");

	}

}

接着我們來看看我們要注入的類的信息

package org.xie.relfect.first;

import org.xie.Interface.IUser;
import org.xie.Interface.impl.ChineseUserImpl;
import org.xie.Interface.impl.EnglishUserImpl;
import org.xie.annotation.device.AnnotationTest;
import org.xie.annotation.device.IsAnnotation;
import org.xie.annotation.device.SetterAnnotation;

@IsAnnotation
public class SetterBean {
	
	private IUser userdao;
	
	
	@SetterAnnotation(nation=EnglishUserImpl.class)
	public void setUserdao(IUser userdao) {
		this.userdao = userdao;
	}
	
	
	public void login_Test(){
		
		
		userdao.login();
		
	}
	
	
	
	

}


接着是我們的注解解析類

package org.xie.relfect.first;

import java.lang.reflect.Method;
import java.nio.channels.SeekableByteChannel;

import org.xie.Interface.IUser;
import org.xie.Interface.impl.ChineseUserImpl;
import org.xie.annotation.device.IsAnnotation;
import org.xie.annotation.device.SetterAnnotation;

/**
 * 類似spring容器
 * @author Administrator
 *
 */
public class SpringWine {

	public static SetterBean getBean(){
		
		SetterBean bean=new SetterBean();
		boolean isAnnotation=SetterBean.class.isAnnotationPresent(IsAnnotation.class);
		
		if(isAnnotation){
			
			Method[] method=SetterBean.class.getDeclaredMethods();
			
			for (Method method2 : method) {
				if(method2.isAnnotationPresent(SetterAnnotation.class)){
					SetterAnnotation setterAnnotation=method2.getAnnotation(SetterAnnotation.class);
					 System.out.println("AnnotationTest(field=" + method2.getName()  
	                            + ",nation=" + setterAnnotation.nation() + ")");  
					
					try {
					Class<?> clazz=setterAnnotation.nation();	
					IUser iuser=(IUser) clazz.newInstance();	
					bean.setUserdao(iuser);

						//return bean;
					} catch (Exception e) {
						// TODO: handle exception
						e.printStackTrace();
						return null;
					}
					
				}
				
				
				
			}
			
			
		}
		
		
		
		
		
		return bean;

		//return null;
		
	}
	
	
	
}

測試類

package org.xie.relfect.first;

import javax.swing.Spring;

public class Test {

	public static void main(String[] args) {
	
		SetterBean bean=SpringWine.getBean();
		
		bean.login_Test();
		
	}
	
}


通過改變不同的注解,可以得到不同的結果,當然,這個小例子要優化的東西還有很多很多。。。。如果要做成Spring那樣,要做的東西還是有點工作量的









注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com