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

首先确认下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()方法是针对泛型集合说的,如果想看这个泛型有多少个元素,就调用此方法来查看!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值