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. jquery中的全选、反选、全不选和单删、批删

    HTML页面 <!doctype html><html lang="en"><head> <meta charset="UTF- ...

  2. bzoj3675

    题解:首先要明确一件事,就是当分割的方案固定时,无论先分割的哪一段,结果都是不变的,然后能列出dp方程:\(dp[i][j]=max(dp[k][j-1]+(a[i]-a[k])*(a[n]-a[i] ...

  3. Win10更改CMD控制台的代码页和字体和字号

    注意:936(简体中文)时,指定Consolas等英文字体将无效,会自动变为“新宋体”. 代码页:若是UTF8(65001)应改为:0000fde9 字号:000e0000 -> 12 cmd_ ...

  4. 剑指offer-栈的压入与弹出

    题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序 ...

  5. windows 下的常用工具

    网址:http://cmder.net/ 如果vim乱码  命令行输入  set LC_ALL=zh_CN.UTF8 添加cmder到鼠标右键  c://安装目录/Cmder.exe /REGISTE ...

  6. Linux几种服务用处介绍

    rexec--Remote Execute,远程命令执行,允许远程机器在本机上远程执行命令,监听端口512. nfs--Network File System,网络文件系统,用于将本机文件夹共享到别的 ...

  7. Win10系列:UWP界面布局基础6

    资源合并 前面提到过,可以将资源字典定义在单独的XAML文件中,这样的文件被称为资源字典文件.那么,在需要引用文件中的资源时可以通过ResourceDictionary元素的MergedDiction ...

  8. vue2整个项目中,数据请求显示loading图

    一般项目中,有时候会要求,你在数据请求的时候显示一张gif图片,然后数据加载完后,消失.这个,一般只需要在封装的axios中写入js事件即可.当然,我们首先需要在app.vue中,加入此图片.如下: ...

  9. 一次jenkins的错误

    描述:我svn修改了一个类的名称,然后构建到jenkins发现,原来的类还在然后和现在的类一起冲突 解决:清理工作空间 然后重新部署即可.

  10. JavaScript -基础- 函数与对象(二)String

    一.判断数据类型typeof与判断对象类型instanceof 1.typeof typeof只能判断基础数据类型,无法判断引用数据类型 <script> var s="hell ...