Spring是什么?
个人理解来看,Spring实质是一个超级大工厂,所有的Java对象都能由它来产生,它是所有对象的工厂。
假设现在有A组件与B组件,如果A组件中,需要调用B组件中的方法,那我们称A组件依赖于B组件,下面以Service和DAO为例。。。eg:Serivce中需要调用DAO中的方法,我们称Service依赖于DAO。
在没有Spring前,我们通常会在Service里出现类似这样的代码:UserDAO userDao = new UserDAOImpl(); 这样的去手动创建一个UserDAO的实例,这样做的坏处的Service层与DAO称耦合度很高;假如DAO的实现换了,Service也要跟着修改代码。。。之后我们引入了工厂模式,我们创建一个工厂类,在Service层调用DAO的工厂类去获取DAO组件,但是这样做,就会和工厂去耦合,也不是最佳选择。。。有了Spring,只要在service层提供DAO层的Set方法,然后在spring中配置,就能把DAO注入到Service中,完全解耦,当DAO实现修改了以后,只要修改配置文件即可。。。
控制反转(IOC)和依赖注入
1、setter设值注入
所谓setter注入,就是在注入时,调用需要注入组件的setter方法进行注入。。。
2、构造器注入
所谓构造器注入,就是利用构造器的参数,进行注入(好像是废话,呵呵!)
下面看一个例子,同时用到上面的两种方式
UserService.java
package com.tlf.service; import com.tlf.DAO.UserDao; import com.tlf.pojo.User; public class UserService { private UserDao userDAO ; public void setUserDAO(UserDao userDAO) { this.userDAO = userDAO; } public void addUser(User user){ userDAO.addUser(user); } }这里在Service层为DAO设置了setter方法。。显而易见这里是setter注入
UserDAOImpl.java
package com.tlf.DAOImpl; import com.tlf.DAO.UserDao; import com.tlf.pojo.User; public class UserDAOImpl implements UserDao { @Override public void addUser(User user) { System.out.println("模拟向数据库插入数据"+ user.getUsername() + "-->" + user.getPass()); } }
package com.tlf.test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.tlf.pojo.User; import com.tlf.service.UserService; public class SpringTest { public static void main(String[] args) { ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml"); UserService us = ctx.getBean("userService", UserService.class); User u = ctx.getBean("user", User.class); us.addUser(u); } }
这和BeanFactory是有区别的BeanFactory bf = new XmlBeanFactory(new ClassPathResource("beans.xml")) 用BeanFactory只会创Spring容器,但没有创建里面的Bean;
实质上ApplicationContext是BeanFactory的子类,功能强大于BeanFactory。J2EE项目中大多也是使用ApplicationContext。。下面会介绍ApplicationContext大于BeanFactory的功能。。。
接下来看下最重要的beans.xml配置文件
<?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 http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <bean id="userDAO" class="com.tlf.DAOImpl.UserDAOImpl"/> <bean id="userService" class="com.tlf.service.UserService"> <property name="userDAO" ref="userDAO"></property> </bean> <bean id="user" class="com.tlf.pojo.User"> <constructor-arg value="tlf"></constructor-arg> <constructor-arg value="111111"></constructor-arg> </bean> </beans>
注意:如果你要用setter注入,只要配置property属性即可,设置property 实质就是调用set+首字母大写的方法,eg:property name="abc" 实质调用了setAbc() 方法
<property name="userDAO" ref="userDAO"></property> 这里等于调用了setUserDAO方法,传入参数为userDAO,
ref表示引用容器中其他bean...看到<bean id="userService" class="com.tlf.service.UserService">,马上要反映出对应的Java代码为 userService = new UserService();
构造器注入就不多说了。。。。
接下来一篇文章会说到ApplicationContext比BeanFactory多的功能
1、国际化支持
2、支持资源访问(来自磁盘,网络,IO流,web应用的文件及数据)访问
3、加载多个配置文件
4、事件的支持
现在个人感觉任何一个东西,最重要的基础知识。一旦理解的框架的底层API,那样开发时候每一步都清清楚楚自己在干嘛。。所以以前的知识需要重拾!