Spring注解来注入bean

在classpath中扫描组件

组件扫描,即componetscanning

利用注解来扫描的组件有  @Component  :基本注解,表示一个受Spring管理的组件

@Respository:标识持久层组件

@Service:标识服务层(业务层)组件

@Controller:标识表现层

对于扫描组件,Spring有默认的命名策略,使用非限类名,第一个字母小写,也可以通过value属性值标识组件名称。值得说的是

1.        <context:include-filter>

2.       <context:exclude-filter> 这两个标签

要进行这两个标签的作用 首先要将 Use-default-filters=“false”的情况下才能使用

如果只想扫描指定包下面的Controller或者其他 则添加<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>

如果不想扫描则用<context:exclude-filter>指定的不扫描

详情 请看 http://outofmemory.cn/java/spring/spring-DI-with-annotation-context-component-scan

之后代码简单实现

package com.annotion.service;

import org.springframework.stereotype.Service;

//模拟几个不同层
@Service("myservice")//这样就自定义注解名字了 myservice
public class MyService { public void say (){
System.out.println("I am MyService");
}
} package com.annotion.controller; import org.springframework.stereotype.Controller; @Controller
public class MyController {
public void say (){
System.out.println("I am Controller");
}
} package com.annotion.repository; import org.springframework.stereotype.Repository; @Repository
public class MyRespository {
public void say (){
System.out.println("I am Repository");
}
} package com.annotion.main; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.annotion.controller.MyController;
import com.annotion.repository.MyRespository;
import com.annotion.service.MyService; public class Main { public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");//在工程目录下读取bean的配置。
MyService ms = (MyService) context.getBean("myservice");//bean的名字默认时类的名字,只是将类名字第一个小写,如果要自定义,可以在注解类的时候用value值写上
// MyController mc = (MyController) context.getBean("myController");//上面一个注解名字就是改之后的,后面两个没改
// MyRespository mr = (MyRespository) context.getBean("myRespository");为什么要 ms.say();
// mc.say();
// mr.say(); }
}

bean文件

<!-- 如果要指定某些anntion 则可以使用 标签<context:include-filter>当然  use-defalut-filters要设置为false  -->
<context:component-scan base-package="com.annotion" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Service"/>
</context:component-scan>

如果需要在使用注解的时候进行关联怎么办

使用 @Autowired  也可以使用 @Resource 或者@Inject  后两者功能类似,基本不用,这里只学习 @Autowired注解

使用@Autowired注解要注意几点

@Autowired 的自动装配可以在 方法(setter) 或者成员上面添加

自动装配的bean必须已经是IOC容器里面加载的bean,没有加载不行。

当能够兼容的装配对象不止一个的时候,可以使用@Qualifier指定名字(在方法里面使用@Qualifier整合框架里面比较常见),或者实现的多个兼容的bean中有指定装配bean的名字。

代码测试

package com.annotion.service;

public interface Dao {//公共接口
public void say ();
} package com.annotion.service;
import org.springframework.stereotype.Service; @Service
public class MyDao implements Dao {//其中一个实现 public void say() {
System.out.println("I am MyDao");
} } package com.annotion.service; import org.springframework.stereotype.Service; @Service
public class YouDao implements Dao {//其中一个实现 public void say() {
System.out.println("I am YouDao");
} } package com.annotion.service; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service; @Service("myservice")//这样就自定义注解名字了 myservice
public class MyService { //@Autowired
//@Qualifier("myDao") 这是其中一个办法
private Dao dao; @Autowired//可以在上面也可以在下面用,因为有不止一个接口实现Dao类,所以要使用@Autowired
public void setDao(@Qualifier("myDao")Dao dao) {//这种方式比较常见,建议。
this.dao = dao;
} public void say (){
System.out.println("I am MyService");
dao.say();
}
} //bean文件无需动,主程序也不用动。输出
//I am MyService
//I am MyDao

泛型依赖注入

作用 来自http://www.cnblogs.com/solverpeng/p/5687304.html

一、为了更加快捷的开发,为了更少的配置,特别是针对 Web 环境的开发,从 Spring 4.0 之后,Spring 引入了 泛型依赖注入。

二、泛型依赖注入:子类之间的依赖关系由其父类泛型以及父类之间的依赖关系来确定,父类的泛型必须为同一类型。

通俗一点来说:两个子类之间的依赖关系不需要在子类中去声明,而是在父类中进行了声明,而依赖的纽带就是 泛型类型,必须是相同的父类泛型类型才具有依赖关系。

三、UML 类图:

说明:在 BaseService 中通过 @Autowired 注解自动装配了 BaseDao 的实例。而在 UserService 中并没有注入 UserDao 的实例,但是通过父类的泛型类型,

在 UserService 中已经注入了 UserDao 的实例。Department 与之类似。

四、例子:

package com.test2;

public class BaseRespository<T> {
public void add(){
System.out.println("Respository add...");
}
} package com.test2; import org.springframework.beans.factory.annotation.Autowired; public class BaseService<T> { @Autowired
protected BaseRespository<T> respository; public void add(){
System.out.println("add...");
System.out.println(respository);
} } package com.test2; import org.springframework.stereotype.Repository; @Repository
public class UserRespository extends BaseRespository<User> { } package com.test2; import org.springframework.stereotype.Service; @Service
public class UserService<User> extends BaseService<User> { } package com.test2; import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; import com.test2.Person; public class Main {
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");//在工程目录下读取bean的配置。
UserService us = (UserService)context.getBean("userService");//子类没有装配然而,父类已经帮忙装配,并且可以泛型引用,这大概就是泛型依赖注入了。
us.add(); }
}

Bean

<context:component-scan base-package="com.test2" >
<context:include-filter type="annotation" expression="org.springframework.stereotype.Service"/>
</context:component-scan>

之后进入Spring面向切面编程 SpringAOP

Spring学习三的更多相关文章

  1. spring学习(三) ———— spring事务操作

    前面一篇博文讲解了什么是AOP.学会了写AOP的实现,但是并没有实际运用起来,这一篇博文就算是对AOP技术应用的进阶把,重点是事务的处理. --wh 一.jdbcTemplate 什么是JdbcTem ...

  2. Spring学习(三)--高级装配

    一.Spring profile 在开发软件的时候,有一个很大的挑战就是将应用程序从一个环境迁 移到另外一个环境.开发阶段中,某些环境相关做法可能并不适合迁 移到生产环境中,甚至即便迁移过去也无法正常 ...

  3. spring学习 三 框架的搭建

    1 导入jar包 spring启来最少要5个包,四个核心包和一个依赖的日志包 2 创建配置文件 在dynamic web project下的src目录下,创建一个spring的xml配置文件,名称可以 ...

  4. Spring学习(三)-----Spring自动装配Beans

    在Spring框架,可以用 auto-wiring 功能会自动装配Bean.要启用它,只需要在 <bean>定义“autowire”属性. <bean id="custom ...

  5. Spring学习三----------注入方式

    © 版权声明:本文为博主原创文章,转载请注明出处 Spring注入方式 本篇博客只讲最常用的两种注入方式:设值注入和构造器注入.代码为完整代码,复制即可使用. 1.目录结构 2.pom.xml < ...

  6. Spring学习(三)

    DI (Dependency Injection) 1.依赖注入,组件之间的依赖关系由容器在运行期间决定.Ioc容器注入应用程序某个对象,它所需要的外部资源(包括对象,资源,常量数据). birthd ...

  7. spring学习三:Spring Bean 生命周期

    Bean 的生命周期 理解 Spring bean 的生命周期很容易.当一个 bean 被实例化时,它可能需要执行一些初始化使它转换成可用状态.同样,当 bean 不再需要,并且从容器中移除时,可能需 ...

  8. spring学习三:Spring的Aop、代理

    ref:https://mp.weixin.qq.com/s/J77asUvw8FcnF-6YlX6AAw AOP相关术语:    Joinpoint(连接点):类里面可以被增强的方法,这些方法称为连 ...

  9. Spring学习(六)-----Spring使用@Autowired注解自动装配

    Spring使用@Autowired注解自动装配 在上一篇 Spring学习(三)-----Spring自动装配Beans示例中,它会匹配当前Spring容器任何bean的属性自动装配.在大多数情况下 ...

随机推荐

  1. DPDK 16.04/16.11.2 默认tx offload是关闭的引起tx vlan offload无效

    打开IXGBE调试日志发发现:tx使用ixgbe_xmit_pkts_vec,默认tx offload无效了PMD: ixgbe_set_tx_function(): Using simple tx ...

  2. 二叉搜索树BST(Binary Search Tree)

    二叉搜索树(Binary Search Tree)也叫二叉排序树或二叉查找树.它满足以下性质: 1.非空左子树的所有键值小于其根结点的键值: 2.非空右子树的所有键值大于其根结点的键值: 3.左右子树 ...

  3. 漏洞复现——apache文件解析漏洞

    漏洞描述: 我们可以上传一个文件名末尾包含换行符的文件,以此绕过它的黑名单 影响版本: apache 2.4.0-2.4.29 漏洞分析: <FilesMath "\.(?i:php| ...

  4. MySQL 8.0窗口函数

    团队介绍 网易乐得DBA组,负责网易乐得电商.网易邮箱.网易技术部数据库日常运维,负责数据库私有云平台的开发和维护,负责数据库及数据库中间件Cetus的开发和测试等等. 一.窗口函数的使用场景 作为I ...

  5. Spring + Mybatis项目实现数据库读写分离

    主要思路:通过实现AbstractRoutingDataSource类来动态管理数据源,利用面向切面思维,每一次进入service方法前,选择数据源. 1.首先pom.xml中添加aspect依赖 & ...

  6. Hadoop介绍-4.Hadoop中NameNode、DataNode、Secondary、NameNode、JobTracker TaskTracker

    Hadoop是一个能够对大量数据进行分布式处理的软体框架,实现了Google的MapReduce编程模型和框架,能够把应用程式分割成许多的 小的工作单元,并把这些单元放到任何集群节点上执行.在MapR ...

  7. [CodeForces - 197B] B - Limit

    B - Limit You are given two polynomials: P(x) = a0·xn + a1·xn - 1 + ... + an - 1·x + an and Q(x) = b ...

  8. redis的文件事件

    redis的文件事件:即与io相关的事件. /* File event structure */ typedef struct aeFileEvent { int mask; /* one of AE ...

  9. Express 路径请求及对应的获取路径形式

    req.query // GET /search?q=tobi+ferret req.query.q // => "tobi ferret" // GET /shoes?or ...

  10. react router @4 和 vue路由 详解(二)react-router @4用法

    完整版:https://www.cnblogs.com/yangyangxxb/p/10066650.html 2.react-router @4用法 a.大概目录      不需要像vue那样麻烦的 ...