java spring Ioc(反射)机制
2014-10-13 09:50
375 查看
1.java spring IOC正常写法,导入spring包
ApplicationContext ctx = newClassPathXmlApplicationContext("applictionContext.xml");
Teach s = (Teach) ctx.getBean(Teachid);
ClassPathXmlApplicationContext是spring包自带,我们是不是可以自己写一个类拟的功能呢,答案是肯定的。
2.自定义ClassPathXmlApplicationContext
这里需要导入解析xml包:jdom.2.1BeanFactory.java(先定义一个工厂接口)
package self.spring;
public interface BeanFactory {
public Object getBean(String beanId);
}
2.2ClassPathXmlApplicationContext.java
package self.spring;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.jdom.Element;
publicclass ClassPathXmlApplicationContextimplements
BeanFactory{
private Map<String, Object>beans =
new HashMap<String, Object>();
@Override
public Object getBean(String beanId) {
returnbeans.get(beanId);
}
@SuppressWarnings({"unchecked",
"unused" })
public ClassPathXmlApplicationContext(String xmlfile) {
org.jdom.input.SAXBuilder sb =new org.jdom.input.SAXBuilder();
org.jdom.Document doc =
null;
try {
//构造xml文档对像
doc = sb.build(this.getClass().getClassLoader()
.getResourceAsStream(xmlfile));
} catch (Exception e) {
System.out.println("docError:" +this.getClass()
+".java\t\n "
+ e.toString());
}
org.jdom.Element root = doc.getRootElement();//根元素
@SuppressWarnings("rawtypes")
List list = root.getChildren("bean");
for (int i = 0; i < list.size(); i++) {
org.jdom.Element element = (Element) list.get(i);
String id = element.getAttributeValue("id");
if (null == id) {
id = element.getAttributeValue("name");
}
String classes = element.getAttributeValue("class");
Object o = null;
try {
o = Class.forName(classes).newInstance();
} catch (Exception e) {
System.out.println("Object oError:" +this.getClass()
+
".java\t\n" + e.toString());
}
System.out.println("id:" + id +"\t"
+ "classes:" + classes);
beans.put(id, o);
for (Element properyElement : ((List<Element>) element
.getChildren("property"))) {
String name = properyElement.getAttributeValue("name");
String bean = properyElement.getAttributeValue("bean");
String value = properyElement.getAttributeValue("value");//这里暂时不写value,因为类型太多原因
String factory_method = properyElement
.getAttributeValue("factory-method");//方法注入
if (null == bean) {
bean = properyElement.getAttributeValue("ref");//
为了兼容spring官方属性
}
Object beanObject =beans.get(bean);
String methodName ="set" + name.substring(0,1).toUpperCase()
+ name.substring(1);
System.out.print("method name= " + methodName);
Class oo =
null;
try {
oo = beanObject.getClass().getInterfaces()[0];//接口
} catch (Exception e) {
oo = beanObject.getClass();//类
}
Method m =
null;
try {//小写set后面方法setmethod
m = o.getClass().getMethod("set" + name, oo);
} catch (NoSuchMethodException | SecurityException er) {
}
try {//正常方法
setMethod
m = o.getClass().getMethod(methodName, oo);
} catch (NoSuchMethodException | SecurityException e) {
}
try {
m.invoke(o, beanObject);//执行方法
} catch (Exception ex) {
System.out.println("Error:" +this.getClass()
+
".java\t\n" + ex.toString());
}
}
}
}
}
3.测试
package self.service;
import junit.framework.TestCase;
import self.model.Teacher;
import self.spring.BeanFactory;
import self.spring.ClassPathXmlApplicationContext;
publicclass TestTeacherextends TestCase {
publicvoid testSave(){
BeanFactory bean =
new ClassPathXmlApplicationContext("teach_beans.xml");
Teacher teacher=(Teacher) bean.getBean("teacher");
teacher.setAge(30);
teacher.setSid("No154545");
teacher.setSname("自己写的IOC类");
TeacherService t = (TeacherService) bean.getBean("teacherService");
// teacher.setStudent(student);
t.saveTeacher();
}
}
运行结果:
id:teacher classes:self.model.Teacher
id:tDao classes:self.impl.TeacherDAOImpl
id:teacherService classes:self.service.TeacherService
method name = setTdaomethod name = setTeach教师证号:No154545 姓名:自己写的IOC类保存成功!
4.上述要用的类及xml源
TeacherDAO.java
package self.dao;
import self.model.Teacher;
publicinterface TeacherDAO {
publicvoid saveTeacher(Teacher t);
}
TeacherDAOImpl.java
package self.impl;
import self.dao.TeacherDAO;
import self.model.Teacher;
publicclass TeacherDAOImplimplements TeacherDAO
{
@Override
publicvoid saveTeacher(Teacher t) {
if(null != t){
//数据库操作,省
System.out.println(t.toString()+"保存成功!");
}else{
System.out.println("Error:对像为空,不能保存!!!");
}
}
}
Teacher.java
package self.model;
publicclass Teacher {
private Stringsid;
private Stringsname;
privateint
age;
public String getSid() {
returnsid;
}
publicvoid setSid(String sid) {
this.sid = sid;
}
public String getSname() {
returnsname;
}
publicvoid setSname(String sname) {
this.sname = sname;
}
publicint getAge() {
returnage;
}
publicvoid setAge(int
age) {
this.age = age;
}
public String toString(){
return"教师证号:"+this.getSid()+" 姓名:"+this.getSname();
}
}
TeacherService.java
package self.service;
import self.dao.TeacherDAO;
import self.model.Teacher;
publicclass TeacherService {
private TeacherDAOtdao;
private Teacherteach;
public TeacherDAO getTdao() {
returntdao;
}
publicvoid setTdao(TeacherDAO tdao) {
this.tdao = tdao;
}
public Teacher getTeach() {
returnteach;
}
publicvoid setTeach(Teacher teach) {
this.teach = teach;
}
publicvoid saveTeacher(){
tdao.saveTeacher(teach);
}
}
teach_beans.xml
<?xmlversion="1.0"encoding="UTF-8"?>
<beans>
<beanid="teacher"class="self.model.Teacher"></bean>
<beanid="tDao"class="self.impl.TeacherDAOImpl"></bean>
<beanid="teacherService"class="self.service.TeacherService">
<propertyname="tdao"ref="tDao"></property>
<propertyname="teach"ref="teacher"></property>
</bean>
</beans>
相关文章推荐
- 番外 01:Spring IoC 实现原理简析,Java的反射机制,通过类名创建对象
- 番外 01:Spring IoC 实现原理简析,Java的反射机制,通过类名创建对象
- 《Spring 3.x 企业应用开发实战》学习笔记 第三章 IoC容器概述 3.2 相关Java基础知识 类装载器 反射机制
- 《Spring 3.x 企业应用开发实战》学习笔记 第三章 IoC容器概述 3.2 相关Java基础知识 类装载器 反射机制
- 番外 01:Spring IoC 实现原理简析,Java的反射机制,通过类名创建对象
- 番外 01:Spring IoC 实现原理简析,Java的反射机制,通过类名创建对象
- 番外 01:Spring IoC 实现原理简析,Java的反射机制,通过类名创建对象
- 番外 01:Spring IoC 实现原理简析,Java的反射机制,通过类名创建对象
- 番外 01:Spring IoC 实现原理简析,Java的反射机制,通过类名创建对象
- 番外 01:Spring IoC 实现原理简析,Java的反射机制,通过类名创建对象
- 番外 01:Spring IoC 实现原理简析,Java的反射机制,通过类名创建对象
- 番外 01:Spring IoC 实现原理简析,Java的反射机制,通过类名创建对象
- 番外 01:Spring IoC 实现原理简析,Java的反射机制,通过类名创建对象
- 利用java的反射机制和dom4j 模拟spring核心
- Java 学习笔记03:Spring 3.0 核心机制 IoC
- 使用JAVA注解和反射模拟spring的IOC
- java反射机制(三)---java的反射和代理实现IOC模式 模拟spring
- Spring实例-通过Java的反射机制和spring IOC初始化JavaBean
- 利用Java的反射与代理机制实现IOC
- Java利用spring注解做反射机制