目录
一、spring环境修改
1、修改版本号,删掉多余服务
2、添加依赖
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.2.4.RELEASE</version> </dependency>
3、查看是否成功
4、编写类与测试方法
5、创建资源目录
6、创建xxxx.xml文件,名字自定义,添加规范和bean
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="userService" class="com.wode.service.UserService"/> <bean id="userDao" class="com.wode.dao.UserDao"/> </beans>
7、编写main方法,并测试。
二、Bean对象底层实现(粗略)
以往我们都是使用new来新建一个对象,而我们现在为了简化java开发,减少耦合,springIOC就此应运而生。它使用一个Bean对象来解决这些问题。即只要创建对象,他不会在代码中随时去“new”一个,而是在bean中完成这个操作,这样就达成了易修改,减少耦合的目的。(非常粗略的一些想法,仅仅是为了便于理解,更深层次的问题,可以去查询相关博文等)
1、先创建一个maven项目,引入解析文件的dom4j(手写解析很麻烦,使用已经做好的jar吧)。pom.xml中添加dom4j依赖
<dependency> <groupId>dom4j</groupId> <artifactId>dom4j</artifactId> <version>1.6</version> </dependency> <dependency> <groupId>jaxen</groupId> <artifactId>jaxen</artifactId> <version>1.1.6</version> </dependency>
2、编写测试对象UserService和UserDao和对应的test测试方法,
编写xxxx.xml文件(spring.xml),手写XML(不去官网复制规范)
<?xml version="1.0" encoding="UTF-8" ?> <beans> <bean id="userService" class="com.wode.service.UserService"/> <bean id="userDao" class="com.wode.dao.UserDao"/> </beans>
3、com.xxxx.po(po是新建的包)下新建一个MyBean类,用来存放bean标签中的id和class
4、新建一个factory包,在factory中新建一个生产Bean对象的工厂(接口Myfactor)
其中Object是所有类的父类(java基础),所以创建的UserService类等都是Object的子类,相当于
Object object = new UserService();
当使用UserService对象时,需要强制转换成UserService类
5、创建一个MyClassPathXmlApplication来继承MyBean,相当于ApplicationContext,ApplicationContext也是继承BeanFactory的。
这里我们已经创建好了spring.xml文件,也写了返回对象的getBean方法,所以这里就需要让他们链接起来所以就需要:
1、写一个方法,解析spring.xml,获得里面bean标签中的id和class,这里就用到创建的MyBean类了,使用它来接收数据,然后吧接收的数据储存到List<MyBean>中
2、通过获得的class(类地址),实例化对象,并且储存到map中。然后实现getBean方法。
6、先创建一个List<MyBean>和Map<String,Object>。
7、写parselXml解析spring.xml文件
这里使用了dom4j解析spring.xml文件,使用xpath解析bean标签
private void parselXml(String fileName) { //获取解析器 SAXReader saxReader = new SAXReader(); //找到文件所在的url URL url = this.getClass().getClassLoader().getResource(fileName); //解析其配置文件请,返回Document对象 try { Document document = saxReader.read(url); //通过xpath语法解析标签 XPath xPath = document.createXPath("beans/bean"); //通过xpath解析指定元素 List<Element> elementList = xPath.selectNodes(document); //判断元素集合 if(elementList!=null&&elementList.size()>0){ //实例化结合 beanList = new ArrayList<>(); //遍历集合 for (Element el:elementList){ //获取元素的id属性值和class String id = el.attributeValue("id"); String clazz = el.attributeValue("class"); //将idclass的值设置到mybean中 MyBean myBean = new MyBean(id,clazz); //设置到集合 beanList.add(myBean); } } } catch (DocumentException e) { e.printStackTrace(); } }
8、实例化对象
private void instanceBean() { //判断bean对的集合是否存在 if (beanList!=null&&beanList.size()>0) //遍历 for (MyBean bean:beanList){ try { String id = bean.getId(); //值(实例化好的对象)通过class属性值得到实例化对象 Object object = Class.forName(bean.getClazz()).newInstance(); //设置map beanMap.put(id,object); }catch (Exception e){ e.printStackTrace(); } } }
9、创建带参构造方法,调用解析和实例化方法
public MyClassPathXmlApplication(String fileName) { //解析配置文件 this.parselXml(fileName); //实例化bean对象 this.instanceBean(); }
10、实现getBean方法
public Object getBean(String id) { return beanMap.get(id); }
11、测试