(九)利用Annocation配置注入关系

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

猜你喜欢

转载自blog.csdn.net/qq1019648709/article/details/80470944