8.2.6 Spring 4.0 增强的自动装配和精确装配

        Spring提供了@Autowired 注解来指定自动装配,@Autowired可以修饰setter方法、普通方法、实例变量和构造器等。当使用@Autowired标注setter方法时,默认采用byType自动装配策略。

        

package edu.pri.lime._8_2_6.bean;

import java.util.Set;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; @Component
public class Chinese { private Axe axe;
private Dog dog; /*
* 指定setter方法进行自动装配,Spring将会自动搜索容器中类型为Axe的Bean实例,并将该Bean实例作为setter方法的参数传入。
* 如果找到多个类型为Axe的Bean,Spring会引发异常。如果没有找到Axe类型的Bean,Spring什么都不执行,也不会引发异常
*/
@Autowired
public void setAxe(Axe axe) {
this.axe = axe;
}
@Autowired
public void setDog(Dog dog) {
this.dog = dog;
}
/*
* 当使用@Autowried修饰带多个参赛的普通方法是,Spring会自动到容器中需找配型匹配的Bean,
*/
@Autowired
public void prepare(Axe axe,Dog dog){
this.axe = axe;
this.dog = dog;
}
/*
* 当使用@Autowired修饰一个实例变量时,Spring将会把容器中与该实例类型匹配的Bean设置为该实例变量的值。
* 如果容器中包含多于一个的Axe实例,则Spring容器会抛出BeanCreateException异常。
*/
@Autowired
public Chinese(Axe axe , Dog dog){
this.axe = axe;
this.dog = dog;
}
/*
* @Autowired 可以用于修饰数组类型的成员变量。
* Spring 会自动搜索容器中所有Axe实例,并以这些Axe实例作为数组元素来创建数组,最后将该数组赋给数组类型的成员变量。
*/
@Autowired
private Axe[] axes; /*
* @Autowired 标注集合类型的实例变量,或标注形参类型的集合方法。
* 对于集合类型的参数而言,必须使用泛型。
*/
@Autowired
public void setAxes(Set<Axe> axeSet){
}
public Axe getAxe() {
return axe;
}
public Dog getDog() {
return dog;
}
public Axe[] getAxes() {
return axes;
}
public void setAxes(Axe[] axes) {
this.axes = axes;
} }

        Spring 4.0 增强后的@Autorwired注解还可以根据泛型进行自动装配。

        Class : BaseDaoImpl<T>

package edu.pri.lime._8_2_6.bean.impl;

import edu.pri.lime._8_2_6.bean.BaseDao;

public class BaseDaoImpl<T> implements BaseDao<T> {

    /*定义所有Dao组件都应该实现的通用方法,其他Dao组件只要继承该类并指定同泛型参数即可*/
public void save(T e) {
System.out.println("程序保存对象 " + e);
} }

        Class : UserDaoImpl

package edu.pri.lime._8_2_6.bean.impl;

import org.springframework.stereotype.Component;

import edu.pri.lime._8_2_6.bean.User;
import edu.pri.lime._8_2_6.bean.UserDao; @Component("userDao")
public class UserDaoImpl extends BaseDaoImpl<User> implements UserDao{ }

        Class : ItemDaoImpl

package edu.pri.lime._8_2_6.bean.impl;

import org.springframework.stereotype.Component;

import edu.pri.lime._8_2_6.bean.Item;
import edu.pri.lime._8_2_6.bean.ItemDao; @Component("itemDao")
public class ItemDaoImpl extends BaseDaoImpl<Item> implements ItemDao { }

        Class : BaseServiceImpl<T>

package edu.pri.lime._8_2_6.bean.impl;

import org.springframework.beans.factory.annotation.Autowired;

import edu.pri.lime._8_2_6.bean.BaseDao;
import edu.pri.lime._8_2_6.bean.BaseService; public class BaseServiceImpl<T> implements BaseService<T> { @Autowired
private BaseDao<T> dao; public void addEntity(T entity){
System.out.println("调用 " + dao + " 保存实体 " + entity);
dao.save(entity);
}
}

        Class : UserServiceImpl

package edu.pri.lime._8_2_6.bean.impl;

import org.springframework.stereotype.Component;

import edu.pri.lime._8_2_6.bean.User;
import edu.pri.lime._8_2_6.bean.UserService; @Component("userService")
public class UserServiceImpl extends BaseServiceImpl<User> implements UserService { }

        Class : ItemServiceImpl

package edu.pri.lime._8_2_6.bean.impl;

import org.springframework.stereotype.Component;

import edu.pri.lime._8_2_6.bean.Item;
import edu.pri.lime._8_2_6.bean.ItemService; @Component("itemService")
public class ItemServiceImpl extends BaseServiceImpl<Item> implements ItemService { }

        Class : BeanTest

package edu.pri.lime._8_2_6.bean.main;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; import edu.pri.lime._8_2_6.bean.Item;
import edu.pri.lime._8_2_6.bean.User;
import edu.pri.lime._8_2_6.bean.impl.ItemServiceImpl;
import edu.pri.lime._8_2_6.bean.impl.UserServiceImpl; public class BeanTest { public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("app_8_2_6.xml");
UserServiceImpl us = ctx.getBean("userService",UserServiceImpl.class);
us.addEntity(new User()); ItemServiceImpl is = ctx.getBean("itemService",ItemServiceImpl.class);
is.addEntity(new Item());
}
}

        @Qualifier允许根据Bean的id来执行自动装配实例变量

    @Autowired
@Qualifier("steelAxe")
public void setAxe(Axe axe) {
this.axe = axe;
}

        @Qualifier允许根据Bean的id来执行自动装配方法的形参

    @Autowired
public void setAxe(@Qualifier("steelAxe") Axe axe) {
this.axe = axe;
}

啦啦啦

        啦啦啦

啦啦啦

啦啦啦

8 -- 深入使用Spring -- 2...6 Spring 4.0 增强的自动装配和精确装配的更多相关文章

  1. 【Spring】浅析Spring框架的搭建

    c目录结构: // contents structure [-] Spring是什么 搭建Spring框架 简单Demo 1,建立User类 2,建立Test类 3,建立ApplicationCont ...

  2. Spring系列之Spring常用注解总结

    传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop.事物,这么做有两个缺点:1.如果所有的内容都配置在.xml文件中,那么.xml文件将会十分庞大:如果按需求分开.xml文件 ...

  3. Spring集成jedis支持Redis3.0集群

    接着上一节,我们通过spring FactoryBean实现redis 3.0集群JedisCluster与spring集成.  http://www.linuxidc.com/Linux/2016- ...

  4. spring笔记3 spring MVC的基础知识3

    4,spring MVC的视图 Controller得到模型数据之后,通过视图解析器生成视图,渲染发送给用户,用户就看到了结果. 视图:view接口,来个源码查看:它由视图解析器实例化,是无状态的,所 ...

  5. Spring学习笔记—Spring之旅

    1.Spring简介     Spring是一个开源框架,最早由Rod Johnson创建,并在<Expert One-on-One:J2EE Design and Development> ...

  6. 【Spring】初始化Spring IoC容器(非Web应用),并获取Bean

    参考文章 Introduction to the Spring IoC container and beans BeanFactory 和ApplicationContext(Bean工厂和应用上下文 ...

  7. Spring基础——在 Spring Config 文件中基于 XML 的 Bean 的自动装配

    一.Spring IOC 容器支持自动装配 Bean,所谓自动装配是指,不需要通过 <property> 或 <constructor-arg> 为 Bean 的属性注入值的过 ...

  8. 一句话概括下spring框架及spring cloud框架主要组件

    作为java的屌丝,基本上跟上spring屌丝的步伐,也就跟上了主流技术.spring 顶级项目:Spring IO platform:用于系统部署,是可集成的,构建现代化应用的版本平台,具体来说当你 ...

  9. Spring学习2—Spring容器

    一.Spring容器接口关系 容器是Spring框架的核心,Spring容器就是一个巨大的工厂.Spring容器使用Ioc(控制反转(Inversion of Control )管理所有组成应用系统的 ...

随机推荐

  1. CSS(三):引入样式和优先级

    CSS的引入样式总共有三种:行内样式(内联样式表).内部样式表.外部样式表.下面分别来介绍这三种样式. 一.行内样式 行内样式也叫内联样式,使用style属性引入CSS样式.看下面的示例: <! ...

  2. IDEA 修改文件编码

    Intellij Idea 修改 properties 文件编码 现象:idea 默认的properties文件是GBK,当有中文时,不同的客户端配置的编码不同时,可能产生中文乱码. 解决:修改pro ...

  3. java对mongoDB的基本操作 ,游标使用

    package com.mongodb.text; import java.net.UnknownHostException; import java.util.List; import org.bs ...

  4. struts2+hibernate(分页实现)

    //Dao类中实现了list集合和pagetotal方法 package zjf.strhib.Dao; import java.util.ArrayList; import java.util.Li ...

  5. 想做web开发 就学JavaScript

    有一天我被问到,为了快速地在 web 开发工作上增加优势,应该学习什么语言.我的思绪回到了大学,那时候我用 Pascal.Fortran.C和汇编语言,不过那个时候有不同的目标. 鉴于当前的状况和趋势 ...

  6. Linux共享库 Linux内核链表

    #ifndef __LINKEDLIST_H_ #define __LINKEDLIST_H_ #include <stdlib.h> #define offsetof(type, mem ...

  7. ssh 中 远程文件传输

    scp 命令是 SSH 中最方便有用的命令了,试想,在两台服务器之间直接传送文件,仅仅用 scp 一个命令就完全解决了. 你可以在一台服务器上 以 root 身份运行 #scp servername: ...

  8. MY_使用selenium自动登录126/163邮箱并发送邮件

    转自:https://www.cnblogs.com/yin-tao/p/7244082.html 我使用的是python2.7.13+selenium ps:几天之前,我曾多次尝试写这段代码,但是在 ...

  9. mysql insert exists || mysql 判断数据是否存在

    情景如下: "今日前端忽然说句, 我需要做个判断, 不能重复收藏, 我犹如颈有寒冰不寒而栗, 于是思考我该怎么做?为什么她都思考到了我没有思考到这是我的工作啊" 思考后得到三种解决 ...

  10. vue input 赋值无效

    1.js代码如下 var vm = new Vue({ el:'#rrapp', data:{ q:{ name: null }, dict: {} }, }); 2.文本框代码如下 <inpu ...