public Class ServiceImpl{
@Autowired
Dao dao;
public void getData(){
dao.getData();
}
public interface IocDao {
public void sayhello(); //一个用来测试的接口
}
public class IocDaoImpl implements IocDao {
@Override
public void sayhello() {
// TODO Auto-generated method stub
System.out.println("hello word");//实现我们的dao接口里的方法
}
}
public interface IocDaoService {
public void sayhello();//业务类接口,这里就跟dao一样
}
public class IocDaoServiceImpl implements IocDaoService {
private IocDao iocDao; //创建一个接口.
public IocDao getIocDao() {
return iocDao;
}
//编写IocDao接口对应的set方法用于依赖注入
//依赖注入的方式有三种:接口注入,构造方法注入,set注入;
//此处为set注入
public void setIocDao(IocDao iocDao) {
this.iocDao = iocDao;
}
@Override
public void sayhello() {
// TODO Auto-generated method stub
iocDao.sayhello();//调用接口方法
}
}
<beans> <bean id="i" class="com.hck.dao.impl.IocDaoImpl"/> <bean id="iocService" class="com.hck.service.impl.IocDaoServiceImpl"> <property name="iocDao" ref="i"></property> </bean> </beans>
//模拟ClassPathXmlApplicationContext实现的一个接口BeanFactory
public interface BeanFactory {
public Object getBean(String beanName);
}
//模拟ClassPathXmlApplicationContext去读取配置文件
public class ClassPathXmlApplicationContext implements BeanFactory {
//定义map集合来存放bean.xml里的bean的id跟其对应的实例化对象
//<bean id="i" class="com.hck.dao.impl.IocDaoImpl"/>
//那么类似的存放bean.put("i",new IocDaoImpl());这样子.
Map<String, Object> beans=new HashMap<String,Object>();
public ClassPathXmlApplicationContext(String xmlPath){
try {
//创建SAXBuilder对象解析文档
SAXBuilder saxBuilder = new SAXBuilder();
//解析build里的参数是一个文件路径.
Document document = saxBuilder.build(xmlPath);
//document.getRootElement().getChildren("bean")获取所有<bean>标签内容
List elements = document.getRootElement().getChildren("bean");
//遍历<bean>对象
for (int i = 0; i < elements.size(); i++) {
//获取第一个<bean>标签elements.get(0);
Element element = (Element) elements.get(i);
//获取<bean>标签里的<id>属性,
//<bean id="i" class="com.hck.dao.impl.IocDaoImpl"/>
//即String beanName="i";
String beanName = element.getAttributeValue("id");
//同上String clazz="com.hck.dao.impl.IocDaoImpl";
String clazz = element.getAttributeValue("class");
//加载类对象并且实例化.Object object=new IocDaoImpl();
Object object = Class.forName(clazz).newInstance();//object是IocDaoServiceImpl
//将他们添加在map集合里,后面可以根据beanName直接获取到实例化对象.
beans.put(beanName, object);
//遍历<bean>标签下的<property>字标签.
//第一个标签没有字标签所以直接跳过.已第二个为例子
//<bean id="iocService" class="com.hck.service.impl.IocDaoServiceImpl">
//<property name="iocDao" ref="i"></property></bean>
List elements2 = element.getChildren("property");
for (int j = 0; j < elements2.size(); j++) {
//此处我们将获得<property name="iocDao" ref="i"></property></bean>
Element element2 = (Element) elements2.get(j);
//相当于String propertyName="iocDao";
String propertyName = element2.getAttributeValue("name");
//相当于String refBean="i";
String refBean = element2.getAttributeValue("ref");
//相当于String propertyName="IocDao";
//目的是为了得到一个方法的名字setIocDao,用于反射调用
propertyName = propertyName.substring(0, 1).toUpperCase() + propertyName.substring(1);
//这里的methodName="setIocDao";
String methodName = "set" + propertyName;
//获取Map集合里Key="i"的值;i对应的是IocDaoImpl的实例化对象
//相当于 Object object2 =IocDaoImpl;
Object object2 = beans.get(refBean);
//获取IocDaoServiceImpl方法里的setIocDao方法.
//第一个方法是方法名,第二个参数是方法的参数类型.
Method method = object.getClass().getDeclaredMethod(methodName,
object2.getClass().getInterfaces());
//调用方法,并传入参数,完成依赖注入.
method.invoke(object, object2);
}
}
// String beanName=document.getElementById(id).attributes().get("class");
// Object object=Class.forName(beanName).newInstance();
// return object;
} catch (Exception e) {
e.printStackTrace();
// TODO: handle exception
}
}
/* (non-Javadoc)
* @see com.hck.ioc.BeanFactory#getBean()
*/
@Override
public Object getBean(String beanName) {
// TODO Auto-generated method stub
return beans.get(beanName);
}
}
public class Ioc {
public static void main(String[] args) {
ClassPathXmlApplicationContext applicationContext=new ClassPathXmlApplicationContext("src/bean.xml");
IocDaoService ids=(IocDaoService)applicationContext.getBean("iocService");
ids.sayhello();
}
}
hello word
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有