为了更好的解释此类操作存在的意义,下面通过一种习惯性的开发进行问题的描述,例如,现在有一个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实现的注入操作,整个的操作流程是非常的简化的.