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