利用annotation配置注入关系

为了更好的解释此类存在的意义,下面通过一段习惯性的开发进行问题的描述,例如:

现在有一个IAdminService服务层,这个服务层要调用的是IAdminDAO和IRoleDAO两个数据层操作,于是定义如下:

范例:定义数据层操作。

package com.Spring.Dao;

public interface IAdminDAO {

    public boolean findLogin();

}

package com.Spring.Dao;

public interface IRoleDAO {

    public boolean findAll();
}

实现层:

package com.Spring.Dao.Imp;

import com.Spring.Dao.IAdminDAO;

public class AdminDAOImpl implements IAdminDAO {

    @Override
public boolean findLogin() {
System.out.println("[IAdminDAO]public boolean findLogin()");
return false;
}
}

package com.Spring.Dao.Imp;

import com.Spring.Dao.IRoleDAO;

public class RoleDAOImpl implements IRoleDAO {

    @Override
public boolean findAll() {
System.out.println("[IRoleDAO]public boolean findAll()");
return false;
}
}

最早的时候,这两个数据层的类一定要编写工厂类,单向现在不用编写工厂类了。

下面直接在appllicationContext.XML文件里面定义。

    <bean id="adminDaoImpl" class="com.Spring.Dao.Imp.AdminDAOImpl"></bean>
<bean id="roleDaoImpl" class="com.Spring.Dao.Imp.RoleDAOImpl"></bean>

随后所有的数据层都要交给业务层操作,那么下面定义业务层操作:

package com.Spring.Service;

public interface IAdminService {

    public boolean login();
}

下面定义实现层:

package com.Spring.Service.Impl;

import com.Spring.Dao.IAdminDAO;
import com.Spring.Dao.IRoleDAO;
import com.Spring.Service.IAdminService; public class IAdminServiceImpl implements IAdminService { private IAdminDAO adminDao;
private IRoleDAO roleDao;
//setter是给依赖注入关系使用的。
public void setAdminDao(IAdminDAO adminDao) {
this.adminDao = adminDao;
}
public void setRoleDao(IRoleDAO roleDao) {
this.roleDao = roleDao;
} @Override
public boolean login() {
this.adminDao.findLogin();
this.roleDao.findAll();
return false;
}
}

定义applicationContext.xml文件,配置彼此关系。

    <bean id="adminDaoImpl" class="com.Spring.Dao.Imp.AdminDAOImpl"></bean>
<bean id="roleDaoImpl" class="com.Spring.Dao.Imp.RoleDAOImpl"></bean>
<bean id="adminServiceImpl" class="com.Spring.Service.Impl.IAdminServiceImpl">
<property name="adminDao" ref="adminDaoImpl"></property>
<property name="roleDao" ref="roleDaoImpl"></property>
</bean>

代码写到此处,可以说最原始的操作完成了,所有的关系通过applicationContext.xml文件完成了,

package com.Spring.Demo;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.Spring.Service.IAdminService;
import com.Spring.Service.Impl.IAdminServiceImpl; public class TestAdmin { public static void main(String args[])
{
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext2.xml");
IAdminService ia=ctx.getBean("adminServiceImpl",IAdminServiceImpl.class);
ia.login();
}
}

执行结果:

此时最直观感受是,避免了工厂类的编写,的确节约了代码,但是反过来,问题又出现了,如果一个项目存在几百个DAO或Service。这种写法太累了。

在Spring之中,可以利用annotation完全简化以上操作。

范例:要增加新的命名空间。

在配置文件中勾选上context命名空间:

会发现配置代码中多了以下代码:

范例:设置annotation的支持包

    <context:annotation-config/>
<context:component-scan base-package="com.Spring"/>

表示在“com.Spring”下所有程序支持annotation的配置。而在spring里面,针对于组件的annotation的配置

只提供三个注解定义(这三个注解定义的作用都一样,只是单词不同):

  1. @Component:主要用于定义组件,一般用于DAO上使用。
  2. @Service:主要用于定义组件,一般用于Service上用。
  3. @Repository:主要用于定义组件,一般用于Action上使用。

范例:修改xxxDAOImpl类:

package com.Spring.Dao.Imp;
import org.springframework.stereotype.Component;
import com.Spring.Dao.IAdminDAO; @Component
public class AdminDAOImpl implements IAdminDAO { @Override
public boolean findLogin() {
System.out.println("[IAdminDAO]public boolean findLogin()");
return false;
}
}

和:

package com.Spring.Dao.Imp;

import org.springframework.stereotype.Component;

import com.Spring.Dao.IRoleDAO;
@Component
public class RoleDAOImpl implements IRoleDAO { @Override
public boolean findAll() {
System.out.println("[IRoleDAO]public boolean findAll()");
return false;
}
}

现在如果使用了注解定义组件,那么名称默认情况下就是类名称的结构形式:

比如:AdiminDAOImpl:则访问组件的名称就是“adminDaoImpl”。

范例:在service层上使用注解:

相比之前,这里的两个adminDao和roleDao的setter方法取消掉了,并且之前配置里面与setter配合使用,将会把如下的实例化作用的<bean>配置也去掉了,

    <bean id="adminDaoImpl" class="com.Spring.Dao.Imp.AdminDAOImpl"></bean>
<bean id="roleDaoImpl" class="com.Spring.Dao.Imp.RoleDAOImpl"></bean>
<bean id="adminServiceImpl" class="com.Spring.Service.Impl.IAdminServiceImpl">
<property name="adminDao" ref="adminDaoImpl"></property>
<property name="roleDao" ref="roleDaoImpl"></property>
</bean>

取而代之的是注解:@Resource,来代替上面的这两个属性,表示此为注入的资源

package com.Spring.Service.Impl;
import javax.annotation.Resource; import org.springframework.stereotype.Service; import com.Spring.Dao.IAdminDAO;
import com.Spring.Dao.IRoleDAO;
import com.Spring.Service.IAdminService;
@Service
public class IAdminServiceImpl implements IAdminService { @Resource  //表示此为注入的资源
private IAdminDAO adminDao;
@Resource
private IRoleDAO roleDao;
@Override
public boolean login() {
this.adminDao.findLogin();
this.roleDao.findAll();
return false;
}
}

此时AdminServiceImpl类的引用名称是:IAdminServiceImpl。因此使用的使用,使用getBean操作里面的bean名称也是这个,如下:

测试操作:

package com.Spring.Demo;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.Spring.Service.IAdminService;
import com.Spring.Service.Impl.IAdminServiceImpl; public class TestAdmin { public static void main(String args[])
{
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext2.xml");
IAdminService ia=ctx.getBean("IAdminServiceImpl",IAdminServiceImpl.class);
ia.login();
}
}

现在发现:利用annotation实现的注入操作,整个流程都是非常简化的,以后开发都是此类模式进行。

08-spring学习-annotation配置的更多相关文章

  1. 【转】Spring学习---Bean配置的三种方式(XML、注解、Java类)介绍与对比

    [原文]https://www.toutiao.com/i6594205115605844493/ Spring学习Bean配置的三种方式(XML.注解.Java类)介绍与对比 本文将详细介绍Spri ...

  2. AOP:spring 的Annotation配置

    1.文件目录: 2.实体类 package com.wangcf.po; public class User { private int id; private String name; privat ...

  3. Spring学习---JPA配置和使用

      理论的东西如果不实践,永远不会变成自己的东西.本文将介绍用maven管理,用Hibernate作为JPA供应商,使用MYSQL数据库,配置和使用JPA.   以下代码已经上传至GITHUB.   ...

  4. [原创]java WEB学习笔记103:Spring学习---Spring Bean配置:基于注解的方式(基于注解配置bean,基于注解来装配bean的属性)

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  5. 跟着刚哥学习Spring框架--事务配置(七)

    事务 事务用来保证数据的完整性和一致性. 事务应该具有4个属性:原子性.一致性.隔离性.持久性.这四个属性通常称为ACID特性.1.原子性(atomicity).一个事务是一个不可分割的工作单位,事务 ...

  6. Spring学习(十九)----- Spring的五种事务配置详解

    前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识.通过这次的学习发觉Spring的事务配置只要把思路理清,还是比较好掌握的. ...

  7. 【Java Web开发学习】Spring MVC 开始配置

    Spring MVC 开始配置 转载:http://www.cnblogs.com/yangchongxing/p/8871370.htm 学习搭建最简单的Spring MVC框架. ======== ...

  8. Spring学习(20)--- Schema-based AOP(基于配置的AOP实现) -- 配置切入点pointcut

    pointcut(切断点)表达式: execution(public * *(..)) execution(* set*(..)) execution(* com.xyz.service.Accoun ...

  9. Spring学习资料以及配置环境

    一.Spring4 1.介绍 新特性 SpringIDE 插件 IOC DI 在 Spring 中配置 Bean 自动装配 Bean 之间的关系(依赖.继承) Bean 的作用域 使用外部属性文件 S ...

随机推荐

  1. 3000大洋,自己配置i5主机

    自用的HP笔记本已经“七年之痒”了,所以在2016年新年之前,换了台新电脑.主要用来娱乐(电影),但是也要能够满足工作学习(本人从事IT行业)的需要. 遵循本人一贯的高冷装X的习惯,决定自己买配件攒机 ...

  2. JZYZOJ1518 [haoi2011]b 莫比乌斯反演 分块 容斥

    http://172.20.6.3/Problem_Show.asp?id=1518最开始只想到了n^2的写法,肯定要超时的,所以要对求gcd的过程进行优化.首先是前缀和容斥,很好理解.第二个优化大致 ...

  3. 【SAM】POJ1509-Glass Beads

    [题目大意] 求一个循环数列的最小表示法. [思路] 把原创复制一遍放在后面,建立SAM,从s按字典序开始跑长度L即可. 板子来源(作者见连接内):

  4. Perl读写文件&字符串操作

    Perl中读写文件的方法非常简单,可以使用open或sysopen函数来打开文件,linux下运行perl脚本只需 ./XX.pl 或 perl XX.pl. 读文件 open(文件句柄, " ...

  5. Codeforces Round #345 (Div. 2) B. Beautiful Paintings 暴力

    B. Beautiful Paintings 题目连接: http://www.codeforces.com/contest/651/problem/B Description There are n ...

  6. ORACLE EBS FORM 二次开发常用小技巧

    1.锁住当前行 Set_Item_Instance_Property('main.import_flag', CURRENT_RECORD, UPDATE_ALLOWED, PROPERTY_OFF) ...

  7. 纯CSS实现文字一行居中,多行左对齐的方法

    其实这种需求还是蛮常见的,主要用于产品列表页面,用于产品图片下面,显示产品的名称. 想要实现的效果为: 未知文字长度,当文字长度小于盒子宽度,也就是一行时,文字居中. 当文字长度大于盒子的宽度,会自动 ...

  8. JDBC纯驱动方式连接MySQL

    1 新建一个名为MysqlDemo的JavaProject 2 从http://dev.mysql.com/downloads/connector/j/中下载最新的驱动包. 这里有.tar.gz和.z ...

  9. Hive不等值连接

    select * from ( select t1.instalment_id as r_id , t2.instalment_id as p_id from (select instalment_i ...

  10. 使用rsync进行多服务器同步

    使用rsync进行多服务器同步 @(Others) 当集群数量很大时,修改配置文件和节点之间的文件同步是一件很麻烦且浪费时间的事情. rsync是linux上实现不同机器之间文件同步.备份的工具,ce ...