反射によるクラスの作成

5505 ワード

ここで使用する反射はSpringフレームワークの自動アセンブリをシミュレートする機能であり,Springフレームワークを学習していない場合や反射メカニズムを学んでいない場合,通常クラスのインスタンスを作成するのはnewキーワードによってクラスをインスタンス化しているが,その後javaの反射メカニズムを次々と学び,反射メカニズムによってクラスをインスタンス化することもできる.しかし、毎回コードをたくさん書くのは、相対的に苦痛ですが、Springフレームワークを学びました.その中の依存注入は、Javaの反射メカニズムを使用して、プロファイルを構成することで、クラスのインスタンス化を実現することができます.
次に私たちは自分でSpringの依存注入のこの機能をシミュレートして実現して、本当のSpringフレームワークの依存注入はもちろん私のこの簡単さではありませんて、これは私はただ反射のメカニズムを強固にして、後で使うのが便利です
もちろんこれらの话はすべて私自身がでたらめを言ったので、间违った地方あるいは书いた地方、またどうぞよろしくお愿いします.
この例の手順
1、Javaプロジェクトを作成する
2、必要なクラスを作成する
3、xmlファイルを作成する
第一歩は免れた
2、ここで私が作ったクラスはUsersです.java、UsersDao.java、UsersDaoImpl.java、UsersService.java、UsersServiceImpl.java、BeanFactory.java、ClassPathXmlApplicationContext.java
コード:
Users.java
package com.tenghu.spring.model;

public class Users {
	//  
	private int id;
	//  
	private String name;
	//  
	private int age;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
}

UsersDao.JAva---インタフェース
package com.tenghu.spring.dao;

import com.tenghu.spring.model.Users;

public interface UsersDao {
	public void addUsers(Users user);
}

UsersDaoImpl.java
package com.tenghu.spring.dao.impl;

import com.tenghu.spring.dao.UsersDao;
import com.tenghu.spring.model.Users;

public class UsersDaoImpl implements UsersDao{

	@Override
	public void addUsers(Users user) {
		System.out.println("    ");
	}

}

UsersService.java
package com.tenghu.spring.service;

import com.tenghu.spring.model.Users;

public interface UsersService {
	public void addUsers(Users user);
}

UsersServiceImpl.java
package com.tenghu.spring.service.impl;

import com.tenghu.spring.dao.UsersDao;
import com.tenghu.spring.model.Users;
import com.tenghu.spring.service.UsersService;

public class UsersServiceImpl implements UsersService{
	private UsersDao userDao;

	public UsersDao getUserDao() {
		return userDao;
	}

	public void setUserDao(UsersDao userDao) {
		this.userDao = userDao;
	}

	@Override
	public void addUsers(Users user) {
		userDao.addUsers(user);
	}
	
	
}

BeanFactory.java
package com.tenghu.spring.spring;

public interface BeanFactory {
	//        
	public Object getBean(String name);
}

ClassPathXmlApplicationContext.java
package com.tenghu.spring.spring;

import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;

import com.tenghu.spring.test.Test;

public class ClassPathXmlApplicationContext implements BeanFactory {
	//  Map  
	private Map<String, Object> bean=new HashMap<String, Object>();
	public ClassPathXmlApplicationContext() {
		try {
			//  SAXBuilde  
			SAXBuilder builder = new SAXBuilder();
			//      
			Document doc = builder.build(Test.class.getClassLoader()
					.getResourceAsStream("myApplicationContext.xml"));
			//      
			Element ele = doc.getRootElement();
			//      
			List list = ele.getChildren("bean");
			for (int i = 0; i < list.size(); i++) {
				Element child = (Element) list.get(i);
				String id = child.getAttributeValue("id");
				String clazz = child.getAttributeValue("class");
				//        
				Object o=Class.forName(clazz).newInstance();
				//      
				bean.put(id, o);
				for(Element childElement:(List<Element>)child.getChildren("property")){
					//    
					String name=childElement.getAttributeValue("name");
					String ref=childElement.getAttributeValue("ref");
					//    
					Object obj=bean.get(ref);
					//  set  
					String methodName="set"+name.substring(0,1).toUpperCase()+name.substring(1);
					//      
					Method m=o.getClass().getDeclaredMethod(methodName, obj.getClass().getInterfaces()[0]);
					m.invoke(o, obj);
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	@Override
	public Object getBean(String name) {
		return bean.get(name);
	}

}

3、xmlファイルの作成
<?xml version="1.0" encoding="UTF-8"?>
<beans>
	<bean id="ud" class="com.tenghu.spring.dao.impl.UsersDaoImpl"/>
	<bean id="userServiceImpl" class="com.tenghu.spring.service.impl.UsersServiceImpl">
		<property name="userDao" ref="ud"/>
	</bean>
</beans>

テスト
package com.tenghu.spring.test;

import com.tenghu.spring.model.Users;
import com.tenghu.spring.service.UsersService;
import com.tenghu.spring.spring.BeanFactory;
import com.tenghu.spring.spring.ClassPathXmlApplicationContext;

public class Test {
	public static void main(String[] args) {
		//  ClassPathXmlApplicationPath  
		BeanFactory factory=new ClassPathXmlApplicationContext();
		Users user=new Users();
		user.setId(1);
		user.setName("  ");
		user.setAge(23);
		UsersService us=(UsersService) factory.getBean("userServiceImpl");
		us.addUsers(user);
	}
}

これで機能全体が実現します