- 非spring 开发
public class UserService { private UserDao userDao=new UserDaoImpl(); public void addUser(User user){ userDao.addUser(user); } }
public interface UserDao { public void addUser(User user); }
public class UserDaoImpl implements UserDao { @Override public void addUser(User user) { // TODO Auto-generated method stub //保存数据 这边省略连接数据库操作代码 System.out.println("id:"+user.getId()+",name"+user.getName()); System.out.println("user save !!!"); } }
测试代码
public class Test1 { private UserService userService=new UserService(); private User user; @Before public void init(){ user=new User(); user.setId(1); user.setName("zhangsan"); userService=new UserService(); } @Test public void test(){ userService.addUser(user); } }
结果:
id---1,name---zhangsan
user save !!!
- 模拟spring开发模式,将所有对象都放到容器中,用到的对象从容器中取
- 所有的对象通过xml文件的形式进行配置,使用jdom读取xml文件内容
导包 读取beans.xml文件
<beans> <!-- 配置文件形式 配置 userdao --> <bean id="userDao" class="com.qzzx.dao.impl.UserDaoImpl"></bean> <!-- 配置文件形式 配置userservice --> <bean id="userService" class="com.qzzx.service.UserServiceXml"> <property name="userDao" bean="userDao"></property> </bean> </beans>
public class ClassPathXmlApplicationContext implements BeanFactory{ //定义一个容器存放bean对象 Map<String, Object> map=new HashMap<>(); /** * 初始化容器 */ public ClassPathXmlApplicationContext() { //使用jdom解析 beans.xml文件 SAXBuilder sb=new SAXBuilder(); try { //获取文档对象 Document doc = sb.build(this.getClass().getClassLoader().getResourceAsStream("beans.xml")); //获取根节点 Element root = doc.getRootElement(); //获取所有bean节点 List childrenBean = root.getChildren("bean"); for (int i = 0; i < childrenBean.size(); i++) { //遍历获取单个bean标签,并取得其中id和class属性的值 Element bean = (Element) childrenBean.get(i); String id=bean.getAttributeValue("id"); String clazz=bean.getAttributeValue("class"); //打印查看 // System.out.println("id:"+id+",class:"+clazz); //利用反射原理获得对象,并且实例化 Object obj = Class.forName(clazz).newInstance(); //将对象存到 容器中 map.put(id, obj); //模拟 依赖注入 遍历bean中的标签 List properties = bean.getChildren("property"); for (int j = 0; j < properties.size(); j++) { Element p = (Element) properties.get(j); String name = p.getAttributeValue("name"); String beanName = p.getAttributeValue("bean"); //获得注入对象 Object setObject = map.get(beanName); //采用 set方法将对象注入 clazz名》》set方法名》》method》》执行 method,注入 String methodName="set"+name.substring(0, 1).toUpperCase()+name.substring(1, name.length()); // System.out.println("methodName:"+methodName); // System.out.println("接口名字:"+setObject.getClass().getInterfaces()[0]); Method method = obj.getClass().getMethod(methodName, setObject.getClass().getInterfaces()[0]); method.invoke(obj, setObject); String GetMethodName="get"+name.substring(0, 1).toUpperCase()+name.substring(1, name.length()); // Method method2= obj.getClass().getMethod(GetMethodName); // Object invoke = method2.invoke(obj); // System.out.println(invoke==setObject); } } System.out.println("对象容器:"+map); } catch (Exception e) { e.printStackTrace(); } } @Override public Object getBean(String name) { // TODO Auto-generated method stub return map.get(name); } }
public interface BeanFactory { public Object getBean(String name); }
public class UserServiceXml { private UserDao userDao; public void addUser(User user){ userDao.addUser(user); } public UserDao getUserDao() { return userDao; } public void setUserDao(UserDao userDao) { this.userDao = userDao; } }
public class UserDaoImpl implements UserDao { @Override public void addUser(User user) { // TODO Auto-generated method stub //保存数据 这边省略连接数据库操作代码 System.out.println("id---"+user.getId()+",name---"+user.getName()); System.out.println("user save !!!"); } }
public class Test2 { @Test public void test2(){ ClassPathXmlApplicationContext ac=new ClassPathXmlApplicationContext(); UserServiceXml userServiceXml = (UserServiceXml) ac.getBean("userService"); User user=new User(); user.setId(2); user.setName("李四"); userServiceXml.addUser(user); } }
对象容器:{userService=com.qzzx.service.UserServiceXml@11c836e8, userDao=com.qzzx.dao.impl.UserDaoImpl@6f8cc276} id---2,name---李四 user save !!!