最近一段时间 学java学的 有点迷茫,一直用别人的框架,自己没有积攒什么东西,请求那位大神指点一下
都说spring的核心 是ioc di aop什么的
ioc控制反转
di 依赖注入
aop 面相切面编程 这些理论 咱们都知道 那么问题来了 思想明白了 怎么实现呢下边 分享一下
实现依赖注入 di
咱们一般就是 service中包含dao对吧
我先新建一个UserDao接口
public interface UserDao {
void testUserDao();
}
然后在新建一个UserDao实现类
public class UserDaoImpl implements UserDao {
public void testUserDao(){
System.out.println("我被创建");
}
}
为了篇幅这里就直接新建一个UserService 了
public class UserService {
private UserDao userDao;
public void test(){
userDao.testUserDao();
}
public UserDao getUserDao() {
return userDao;
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
}
再新建一个配置文件 beans.xml
<beans>
<bean id = "userDao" class = "com.ce.model.UserDaoImpl">
</bean>
<bean id = "userService" class = "com.ce.model.UserService">
<property name = "userDao" bean = "userDao"></property>
</bean>
</beans>
我们的类信息都在这个配置文件中配置
基础得东西都新建好了 下边 该怎样注入了
新建一个BeanFactory 接口 用来创建对象
package com.ce.spring;
public interface BeanFactory {
public Object getBean(String name);
}
再新建一个 ClassPathXmlApplicationContext 实现这个接口 这个接口就是用来读取beans.xml文件得内容 再使用反射将类创建出来 这样就完成了
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
import java.io.File;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ClassPathXmlApplicationContext implements BeanFactory{
private Map<String, Object> beans = new HashMap<String,Object>(); // 用来存实例出来得对象
public ClassPathXmlApplicationContext() throws Exception{
SAXBuilder sb = new SAXBuilder();
Document document = sb.build(new File("D:\\work\\idea\\project\\springboot\\spring\\src\\main\\java\\com\\ce\\spring\\beans.xml")); // 这里也可以写你得.xml得相对路径
Element root = document.getRootElement();//获取根元素
List list = root.getChildren("bean");//取出名字为bean的名字
for (int i = 0; i<list.size(); i++){
Element element = (Element) list.get(i);
String id = element.getAttributeValue("id");
String clazz = element.getAttributeValue("class");
Object o = Class.forName(clazz).newInstance();
beans.put(id,o);
for (Element propertyElement: (List<Element>)element.getChildren("property")) {
String name = propertyElement.getAttributeValue("name");
String bean = propertyElement.getAttributeValue("bean");
Object beanObject = beans.get(bean);
String methodName = "set" +name.substring(0,1).toUpperCase() + name.substring(1); // 生成方法名字 setUserdao
final Class<?>[] interfaces = beanObject.getClass().getInterfaces();
Method m = o.getClass().getMethod(methodName, interfaces[0]); //先获取setInfo这个方法
m.invoke(o,beanObject); //调用o对象的setInfo方法 把beanObject传进去
}
}
}
public Object getBean(String name) {
return beans.get(name);
}
测试
@Test
public void testgetbean() throws Exception {
BeanFactory factory = new ClassPathXmlApplicationContext();
UserService user = (UserService) factory.getBean("userService");
user.test();
}
输出结果
最后 请大神 能够指点一下我 俺的联系qq 1598823359