富客户端程序设计实例 - Bean(DAO+Service层) - Spring 为什么要对 Bean 进行托管?
换句话就是Spring进行依赖注入的好处是什么。以BaseService、EmployeeServiceImpl和EmployeeAction
这三个类为例,部分代码如下所示:
这三个类为例,部分代码如下所示:
- public interface BaseService
- {
- public <T> List<T> find(Class<T> cla);
- public <T> void saveOrUpdate(List<T> list);
- public <T> void delete(List<T> list);
- public <T> void saveInfo(List<T> list);
- public <T> void updateInfo(List<T> list);
- }
- ===========================================================
- @Service
- public class EmployeeServiceImpl implements BaseService
- {
- private BaseDao employeeDao;
- public BaseDao getBaseDao()
- {
- return employeeDao;
- }
- @Resource
- public void setBaseDao(BaseDao employeeDao)
- {
- this.employeeDao = employeeDao;
- }
- public <T> List<T> find(Class<T> cla)
- {
- return employeeDao.find(cla);
- }
- public <T> void saveOrUpdate(List<T> list)
- {
- employeeDao.saveOrUpdate(list);
- }
- public <T> void delete(List<T> list)
- {
- employeeDao.delete(list);
- }
- public <T> void saveInfo(List<T> list)
- {
- employeeDao.saveInfo(list);
- }
- public <T> void updateInfo(List<T> list)
- {
- employeeDao.updateInfo(list);
- }
- }
- ================================================================
- public class EmployeeAction extends BaseAction
- {
- private Logger log = LoggerFactory.getLogger(Employee.class);
- public void read()
- {
- String jsonStr = ajaxJson(service.find(Employee.class));
- }
- public void add()
- {
- System.out.println("add() begain |");
- String jsonStr = getJsonFromRequest();
- List<Employee> empList = new ArrayList<Employee>();
- empList.add(getObjectFromJson(jsonStr, Employee.class));
- service.saveInfo(empList);
- }
- public void update()
- {
- System.out.println("update() begain |");
- String jsonStr = getJsonFromRequest();
- List<Employee> empList = new ArrayList<Employee>();
- empList.add(getObjectFromJson(jsonStr, Employee.class));
- service.updateInfo(empList);
- }
- public void destroy()
- {
- String jsonStr = getJsonFromRequest();
- List<Employee> empList = getListFromJson(jsonStr, Employee.class);
- service.delete(empList);
- }
- }
可以看到,在Action层的这个类( EmployeeAction继承了BaseAction EmployeesAction是被间接托管 )里面,我们并没有看到EmployeeServiceImpl的身影,也就是说我们并不关心这个实现类是谁,我们通过BaseService这个接口去引用注入进来的对象,在通过接口调用它的方法;这是设计模式中典型的简单工厂模式。这样Action层的组件和服务层的组件就彻底的解耦了。同样的道理,服务层和DAO层也是这样解耦的。
这种解耦方式和你使用 new 关键字的区别
如果项目很大,Action很多,而且大部分Action都用到了EmployeeServiceImpl 这个服务层的类,你用new这种方法进行创建那么每个Action里都会耦合到“EmployeeServiceImpl”。现在需求有变,用其他的服务类了,比如:ManagerServiceImpl.java。你怎么更改这些new的对象?一个Action中的代码几百行,你怎么去找到?精力上的消耗会非常大。但是用Spring对Bean进行托管的方式则会简单的多。假设:ManagerServiceImpl.java 和 EmployeeServiceImpl.java 一样,他们都继承自BaseService.java。如果我现在要替换一个类,只需要更改为需要的类就可以了,一般只需要改一次即可。
如果你用配置文件的方式托管Bean,则:
<bean id="managerAction" class="org.hongbo.Yangcl.action.ManagerAction">
<property name="BaseService" ref="BaseService"></property>
</bean>
如果你使用注解的方式托管Bean,则:直接删除掉EmployeeServiceImpl类上的@Service标记即可,在 ManagerServiceImpl 上加上@Service标记
个人推荐使用注解的方式,因为配置文件的方式还是比较纷乱。