Spring学习日记(3)建立bean工场实现Dao层
2015-09-23 00:28
696 查看
首先确认下Spring最原始的分包 当然后面越来越往后会越简单 不过刚开始 还是从最开始的走 后面会把注解的坑填完
先说aop 就是面向接口编程 这个接口就是Dao层下的各种接口
再说ioc 其实就是把new的各种Dao层下的文件放到xml配置文件中去 然后利用工场模式将其创建出来并装入容器 (Map方法) 再从容器中取出来就好了
简单的说下前面的spring分层
需要读取的xml配置文件 其实在spring中将接口实现层部署在xml配置文件中可以提高灵活度 因为这里说工场模式 那么就是用工场模式来实现各种的Dao层下的对象
1.先创建一个xml的bean栗子 命名为beans.xml
2.然后是导入解析xml的jdom包 buildpath - add external archive jar 拖入jar包那是web的lib文件夹
2.1 在这里要提一下这个东西
关于Jar包 build path的作用:
jar包不能在随意的地方。 不管是Java Application 还是 Java Web Application 。
Java虚拟机是根据Java ClassLoader(类加载器)决定如何,到那里去加载Class :
我们之所以把jar包放在classPath下,是因为存在ClassPath ClassLoader
我们之所以可以不在ClassPath指定一些Jar包,但在Java程序中也能使用。
那是因为有ClassPath ClassLoader的父类加载器负责加载。如jrd目录下jre\lib*.jar
我们之所以把Jar包放入webroot下的lib文件夹,并且可以在我们的程序中使用,那是容器实现了自己的ClassLoader。(Web中间件服务器类加载的机制和sun公司提供的3个默认加载器不同。)
所以说能不能加载Jar,加载哪里的Jar,是根据ClassLoader决定的。
记得那个ClassLoader 一会要用到这个东西
3.创建模拟的factory工场
其实上述的就是一个接口 通过这个接口new出不同的Dao层下的对象
4.实现工场 该代码的作用就是将xml中对应的各种DaoImpl层对象实例化 并和对应的id放入map容器中
5 . 将容器中的对象取出和Dao层下的对象映射起来 这里用junit来测试是否成功
附
写在最后的小尾巴 说点其他的
1.length属性是针对Java中的数组来说的,要求数组的长度可以用其length属性;
2.length()方法是针对字符串来说的,要求一个字符串的长度就要用到它的length()方法;
3.java中的size()方法是针对泛型集合说的,如果想看这个泛型有多少个元素,就调用此方法来查看!
先说aop 就是面向接口编程 这个接口就是Dao层下的各种接口
再说ioc 其实就是把new的各种Dao层下的文件放到xml配置文件中去 然后利用工场模式将其创建出来并装入容器 (Map方法) 再从容器中取出来就好了
简单的说下前面的spring分层
com.ccav.service//逻辑层 com.ccav.dao//接触数据库的接口层 com.ccav.dao.impl//实现接口层 com.ccav.entity//实体类层 com.ccav.spring//简单的工场包
需要读取的xml配置文件 其实在spring中将接口实现层部署在xml配置文件中可以提高灵活度 因为这里说工场模式 那么就是用工场模式来实现各种的Dao层下的对象
1.先创建一个xml的bean栗子 命名为beans.xml
<beans> <bean id="u" class="com.ccav.dao.imp.UserDAOImpl" /> <bean id="userService" class="com.ccav.sercice.UserService"> <property name="userDAO" bean="u" /> </bean> </beans>
2.然后是导入解析xml的jdom包 buildpath - add external archive jar 拖入jar包那是web的lib文件夹
jdom-2.0.jar
2.1 在这里要提一下这个东西
关于Jar包 build path的作用:
jar包不能在随意的地方。 不管是Java Application 还是 Java Web Application 。
Java虚拟机是根据Java ClassLoader(类加载器)决定如何,到那里去加载Class :
我们之所以把jar包放在classPath下,是因为存在ClassPath ClassLoader
我们之所以可以不在ClassPath指定一些Jar包,但在Java程序中也能使用。
那是因为有ClassPath ClassLoader的父类加载器负责加载。如jrd目录下jre\lib*.jar
我们之所以把Jar包放入webroot下的lib文件夹,并且可以在我们的程序中使用,那是容器实现了自己的ClassLoader。(Web中间件服务器类加载的机制和sun公司提供的3个默认加载器不同。)
所以说能不能加载Jar,加载哪里的Jar,是根据ClassLoader决定的。
记得那个ClassLoader 一会要用到这个东西
3.创建模拟的factory工场
package test1; public interface BeanFactory { public Object getBean(String name);}
其实上述的就是一个接口 通过这个接口new出不同的Dao层下的对象
4.实现工场 该代码的作用就是将xml中对应的各种DaoImpl层对象实例化 并和对应的id放入map容器中
package test1; import java.util.HashMap; import java.util.List; import java.util.Map; import org.jdom2.Document; import org.jdom2.Element; import org.jdom2.input.SAXBuilder; public class ClassPathXmlApplicationContext implements BeanFactory{ private Map<String , Object> beans = new HashMap<String, Object>(); public ClassPathXmlApplicationContext() throws Exception{ SAXBuilder sax = new SAXBuilder();//就是这么写的记住就好了 Document doc = sax.build(this.getClass().getClassLoader().getResourceA sStream("beans.xml"));//如2.1中那个ClassLoader作用是否相似呢? Element element = doc.getRootElement(); List list = element.getChildren("bean"); for (int i = 0; i < list.size(); i++) { Element ele = (Element) list.get(i); String id = ele.getAttributeValue("id"); String cla = ele.getAttributeValue("class"); System.out.println(id + ":" + cla); Object obj = Class.forName(cla).newInstance(); beans.put(id, obj); } } public Object getBean(String name) { // TODO Auto-generated method stub return beans.get(name); } }
5 . 将容器中的对象取出和Dao层下的对象映射起来 这里用junit来测试是否成功
public class ClassPathXmlApplicationContextTest { @Test public void test() throws Exception{ BeanFactory factory = new ClassPathXmlApplicationContext(); UserService service = new UserService(); UserDAO uDao = (UserDAO)factory.getBean("u"); //等价于UserDao uDao = new UserDaoImpl(); service.setUserDAO(uDAO); User u = new User(); service.add(u); } }
附
public class UserService{ private UseDao userDao = new UserDAOImpl(); public UserDAO getUserDAO(){ return userDAO; } public void serUserDAO(UserDAO userDAO){ this.userDAO = userDAO; } public void add(User u){ this.userDAO.save(u); } } //UserDAOImpl public void save(User u){ System.out.println(u+"已经被储存"); }
写在最后的小尾巴 说点其他的
1.length属性是针对Java中的数组来说的,要求数组的长度可以用其length属性;
2.length()方法是针对字符串来说的,要求一个字符串的长度就要用到它的length()方法;
3.java中的size()方法是针对泛型集合说的,如果想看这个泛型有多少个元素,就调用此方法来查看!
相关文章推荐
- java反射机制浅析
- java 面对象的思想
- java的HashMap与ConcurrentHashMap
- spring的学习历程之利用MessageSource实现国际化占位符直接输出原因(一)
- JAVA基础学习(十四)--集合一List和HashSet
- ODL openflowjava和openflowplugin的启动流程,代码详解。
- 使用Spring Mail发送QQ邮件
- Java正则表达式基础入门知识
- Java正则表达式使用
- 打造高性能Java应用需掌握的5大知识
- Spring IOC容器基本原理
- java-邮件发送-mail.jar
- Spring4.1.1.RELEASE和quartz2.1.7整合
- Spring 4.2 方法注入解决单例Bean的原型Bean依赖问题
- AKKA文档(java版)—角色
- Java在生活有哪些应用?
- Java内存管理器
- JAVA 虚函数 抽象函数 抽象类 接口
- SpringMVC常见错误处理
- SpringMVC上传文件