为了更好的解释此类操作存在的意义,下面通过一种习惯性的开发进行问题的描述,例如,现在有一个IAdminService服务层,这个服务层要调用IAdminDAO和IRoleDAO两个数据层操作,于是现在的编写如下
范例:定义数据层操作
IRoleDAO.java
package cn.zwb.dao;
public interface IRoleDAO {
public boolean findAll();
}
IAdminDAO.java
package cn.zwb.dao;
public interface IAdminDAO {
public boolean findLogin();
}
AdminDAOImpl.java
package cn.zwb.dao.impl;
import cn.zwb.dao.IAdminDAO;
public class AdminDAOImpl implements IAdminDAO {
@Override
public boolean findLogin() {
System.out.println("[IAdminDAO] findLogin");
return false;
}
}
RoleDAOImpl.java
package cn.zwb.dao.impl;
import cn.zwb.dao.IRoleDAO;
public class RoleDAOImpl implements IRoleDAO{
@Override
public boolean findAll() {
System.out.println("[IRoleDAO] findAll");
return false;
}
}
最早的时候这两个数据层的类一定要编写工厂类,下面直接在applicationContext.xml文件里面定义.
<bean id="adminDAOImpl" class="cn.zwb.dao.impl.AdminDAOImpl"></bean>
<bean id="roleDAOImpl" class="cn.zwb.dao.impl.RoleDAOImpl"></bean>
随后所有的数据层一定要交给业务层进行调用,那么下面定义业务层的操作:
IAdminService.java
package cn.zwb.service;
public interface IAdminService {
public boolean login();
}
AdminServiceImpl.java
package cn.zwn.service.impl;
import cn.zwb.dao.IAdminDAO;
import cn.zwb.dao.IRoleDAO;
import cn.zwb.service.IAdminService;
//setter是给依赖注入关系使用的
public class AdminServiceImpl implements IAdminService{
private IAdminDAO adminDAO;
private IRoleDAO roleDAO;
@Override
public boolean login() {
this.adminDAO.findLogin();
this.roleDAO.findAll();
return false;
}
public IAdminDAO getAdminDAO() {
return adminDAO;
}
public void setAdminDAO(IAdminDAO adminDAO) {
this.adminDAO = adminDAO;
}
public IRoleDAO getRoleDAO() {
return roleDAO;
}
public void setRoleDAO(IRoleDAO roleDAO) {
this.roleDAO = roleDAO;
}
}
类编写完成之后,下面需要定义applicationContext.xm文件,在这里面配置彼此的关系.
<bean id="adminService" class="cn.zwn.service.impl.AdminServiceImpl">
<property name="adminDAO" ref="adminDAOImpl"></property>
<property name="roleDAO" ref="roleDAOImpl"></property>
</bean>
代码写到此处可以说最原始的操作实现完成,所有的关系都通过applicationContext.xml完成了
此时最大的直观感受就是避免了工厂类的编写操作,的确是节约了代码,但是反过来想,问题又会出现了,如果一个项目之中存在了有几百个DAO或Service,这样的写法太累了,
在Spring之中可以利用Annotation完全简化以上的操作.
范例:要增加新的命名空间
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.1.xsd">
范例:设置Annocation的支持包
<context:annotation-config/>
<context:component-scan base-package="cn.zwb"></context:component-scan>
现在表示在"cn.zwb"下的所有程序类都支持Annocation的配置,而在Spring里面针对于组件Annocation配置只提供有三个注解定义(这三个注解的作用都一样,只是单词不同)
@Component:主要用于定义组件,一般都在DAO上使用
@Service:主要用于定义组件,一般都在Service上使用
@Repository:主要用于定义组件,一般在Action上使用
范例:修改XxxDAOImpl类
package cn.zwb.dao.impl;
import org.springframework.stereotype.Component;
import cn.zwb.dao.IRoleDAO;
@Component
public class RoleDAOImpl implements IRoleDAO{
@Override
public boolean findAll() {
System.out.println("[IRoleDAO] findAll");
return false;
}
}
package cn.zwb.dao.impl;
import org.springframework.stereotype.Component;
import cn.zwb.dao.IAdminDAO;
@Component
public class AdminDAOImpl implements IAdminDAO {
@Override
public boolean findLogin() {
System.out.println("[IAdminDAO] findLogin");
return false;
}
}
现在如果使用了注解定义组件,那么名称默认情况下就是类名称的结构形式:
AdminDAOImpl,则访问此组件的名称就是"adminDAOImpl"
RoleDAOImpl,则发那个文此组件的名称就是"roleDAOImpl"
范例:在Service层使用注解
package cn.zwn.service.impl;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import cn.zwb.dao.IAdminDAO;
import cn.zwb.dao.IRoleDAO;
import cn.zwb.service.IAdminService;
@Service
public class AdminServiceImpl implements IAdminService{
@Resource
private IAdminDAO adminDAO;
@Resource
private IRoleDAO roleDAO;
@Override
public boolean login() {
this.adminDAO.findLogin();
this.roleDAO.findAll();
return false;
}
}
此时的AdminServiceImpl类的引用名称是 adminServiceImpl
范例:测试操作
package cn.zwb.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import cn.zwb.service.IAdminService;
public class TestAdmin {
public static void main(String[] args) {
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
IAdminService vo=ctx.getBean("adminServiceImpl",IAdminService.class);
vo.login();
}
}
现在发现利用Annocation实现的注入操作,整个的操作流程是非常的简化的.