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