您的位置:首页 > 编程语言 > Java开发

Spring学习日记(3)建立bean工场实现Dao层

2015-09-23 00:28 696 查看
首先确认下Spring最原始的分包 当然后面越来越往后会越简单 不过刚开始 还是从最开始的走 后面会把注解的坑填完

先说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()方法是针对泛型集合说的,如果想看这个泛型有多少个元素,就调用此方法来查看!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: