java之Spring(IOC)装配Bean(手动装配、自动装配、注解装配)
在上一篇控制反转中我们看到了依靠一个Bean文件来实现对代码的控制,可谓十分便捷,再也不用去实例化对象了,2333~~~
1.手动装配
<bean id="todo" class="com.eco.daoimp.Usertodo1"></bean> <!--定义Userservice类内部接口的引用(userdao)指向具体的实现类对象(Usertodo1) -->
<bean id="userservice" class="com.eco.service.Userservice">
<property name="userdao" ref="todo"></property>
6 </bean>
这里我们是手动装配Bean,指定Userservice类下的成员变量userdao是Usertodo1的实例化对象。
2.自动装配
1 <bean id="userdao2" class="com.eco.daoimp.Usertodo2" /> 2 <bean id="userdao" class="com.eco.daoimp.Usertodo1" />
<bean id="userservice" class="com.eco.service.Userservice" auto-wire="byName" />
看这个自动装配类型:
byName:为Userservice类下的成员变量userdao自动装配id/name属性为userdao的bean,就是第二个bean,如果找不到名
为userdao的bean,就会报错!!!
byType:为Userservice类下的成员变量userdao自动装配与之类型相同(UserDao)的bean,因为Usertodo1和Usertodo2
都是UserDao的实现了类,所以都会符合要求,那么程序就在纠结:到底装配id是userdao的bean还是装配id为
userdao2的bean呢,迟迟下不了决定,只好报错!!!所以慎用~~
除此之外还有一个在beans标签定义的default-auto-wire="byName",相当于一个全局声明,告诉所有的bean标签采用我说
的声明方式进行装配。
3.注解装配
annotation注解,注解就是采用一个@加上字段进行声明,就像我们常见的@Test、@Override等等
采用注解进行装配之前,bean.xml文件要较之前有个改变:
<?xml version="1.0" encoding="UTF-8"?>
<beans 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-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd"> 10 <context:component-scan base-package="com.eco"></context:component-scan>
</beans>
红字是较之前手动装配/自动装配新增的声明字段,然后内部只有一个标签,这个标签告诉容器要解析哪个包下的bean。
@Service
public class Userservice {
// 定义接口的引用
private UserDao userdao; // 定义setter方法,设置接口的引用指向哪个实现类的对象
@Autowired
public void setUserdao(UserDao userdao) {
this.userdao = userdao;
} public void useradd(User newuser) {
// 此时的userdao经过spring依赖注入之后已经实现指向特定的接口实现类对象
// 那么调用接口的方法,实际上是调用了特定实现类的方法的
userdao.adduser(newuser);
}
}
@Repository
public class Usertodo1 implements UserDao {
// 接口实现类为方法添加方法体
public void adduser(User user) {
// 利用Hibernate的工厂类获得Session对象和事务对象Transaction
Session session = HibernateSessionFactory.getSession();
Transaction transaction = session.beginTransaction();
// 数据库添加用户操作
session.save(user);
// 提交事务
transaction.commit();
// 关闭session对象
session.close();
System.out.println("todo1 create the user");
}
}
红字标注的三个注解意思就是:为@Service声明的Userservice类,内部的@Autowired声明的userdao变量,注入了
@Repository声明的Usertodo1实现类。
依赖注入有①接口注入②setter注入③构造方法注入,很明显上面的例子是setter注入,
接口注入就将注解写在定义的成员变量上;
setter注入就将注解写在setter方法上;
构造方法注入就将注解写在构造方法上(很明显上面没有定义构造方法)。
调用的时候方法还是和之前一样:
public class Test1 {
@Test
public void add() {
// Spring读取beans。xml文件
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
// 解析id为userservice的bean标签,内部实现UserDao userdao = new Usertodo1()
Userservice service = (Userservice) ctx.getBean("userservice");
User newuser = new User("桔子桑", 31);
// 此时调用的useradd()方法,就是接口实现类Usertodo1的useradd()方法
service.useradd(newuser);
}
}
只是这个bean的名称,默认是采用@Service声明的类的名称首字母小写,其余不变作为bean的id/name;
我们也是可以自定义这个bean名称的,@Service("eco"),像这样在括号里就可以自定义名称了。
java之Spring(IOC)装配Bean(手动装配、自动装配、注解装配)的更多相关文章
- 使用Spring IoC进行Bean装配
Spring概述 Spring的设计严格遵从的OCP(开闭原则),保证对修改的关闭,也就是外部无法改变spring内部的运行流程:提供灵活的扩展接口,也就是可以通过extends,implements ...
- Spring Ioc源码分析系列--自动注入循环依赖的处理
Spring Ioc源码分析系列--自动注入循环依赖的处理 前言 前面的文章Spring Ioc源码分析系列--Bean实例化过程(二)在讲解到Spring创建bean出现循环依赖的时候并没有深入去分 ...
- Spring学习(六)bean装配详解之 【通过注解装配 Bean】【基础配置方式】
通过注解装配 Bean 1.前言 优势 1.可以减少 XML 的配置,当配置项多的时候,XML配置过多会导致项目臃肿难以维护 2.功能更加强大,既能实现 XML 的功能,也提供了自动装配的功能,采用了 ...
- Spring学习(七)bean装配详解之 【通过注解装配 Bean】【自动装配的歧义解决】
自动装配 1.歧义性 我们知道用@Autowired可以对bean进行注入(按照type注入),但如果有两个相同类型的bean在IOC容器中注册了,要怎么去区分对哪一个Bean进行注入呢? 如下情况, ...
- [Java复习] Spring IoC
1. Spring bean的生命周期? 1. 对Bean进行实例化(相当于new) 对于BeanFactory 当客户向容器请求一个尚未初始化的bean(或初始化bean需要注入另外一个尚未初始化的 ...
- Spring_总结_03_装配Bean(一)_自动装配
一.前言 本文承接上一节:Spring_总结_02_依赖注入 在上一节我们了解到依赖注入的实质就是装配. 这一节我们来学习下装配Bean的相关知识. 二.Bean的装配机制 1.三种装配机制 Spri ...
- Spring IOC 之Bean作用域
当你创建一个bean定义的时候,你创建了一份通过那种bean定义的bean的创建类的真正实力的处方.bean的定义是一个处方 的想法是很重要的的.因为这意味着,对于一个类你可以创建很多对象实例从一个单 ...
- Spring IOC之Bean 概述
1.Bean概述 一个Spring IOC容器管理一个或者多个bean.这些bean是根据你提供给容器的配置数据信息创建的,例如XML形式的的定义. 在容器内部,这些bean的定义表示为BeanDef ...
- Spring IOC的Bean对象
---恢复内容开始--- 在Spring IOC模块中Bean是非常重要的.在这里我想给大家讲讲关于Bean对象实例化的三种注入方式: 首先,我先讲一下关于Bean对象属性值的两种注入方式:set注入 ...
- Java框架spring 学习笔记(十四):注解aop操作
回见Java框架spring Boot学习笔记(十三):aop实例操作,这里介绍注解aop操作 首先编写一个切入点HelloWorld.java package com.example.spring; ...
随机推荐
- 【OpenCV文档】用于角点检测的Fast算法
原文地址:http://docs.opencv.org/trunk/doc/py_tutorials/py_feature2d/py_fast/py_fast.html#fast-algorithm- ...
- Cocos2D:塔防游戏制作之旅(十三)
让我们看一下Waves.plist文件,你将注意到它包含了3个数组.每一个数组表示一波攻击,也就是一组敌人一起到达闹事.第一个数组包含6个字典.每一个字典定义1个敌人. 在本次教程中,字典只存储敌人应 ...
- UNIX环境高级编程——进程环境
一.main函数 C程序总是从main函数开始.当内核执行C程序时,在调用main前先调用一个特殊的启动例程.可执行程序文件将此启动例程指定为程序的起始地址--这是由连接编译器设置的,而连接编译器则由 ...
- memcached 详解
Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度.Memcached ...
- 小强的HTML5移动开发之路(18)——HTML5地理定位
来自:http://blog.csdn.net/dawanganban/article/details/18192091 在前面的<小强的HTML5移动开发之路(2)--HTML5的新特性> ...
- Android Studio 从安装到配置使用
Android Studio是谷歌为android量身定制的IDE,在2013年谷歌大会上提出之后一直持续更新,现在已经是功能十分强劲的android开发工具,作为一个android开发者,还是早点转 ...
- andrid面试题
下面的题目都是楼主在android交流群大家面试时遇到的,如果大家有好的题目或者好的见解欢迎分享,楼主将长期维护此帖. 某公司高级面试题(2015-03-14)[感谢helder分享] 1.详述And ...
- CUDA Cuts: Fast Graph Cuts on the GPU
原文出处: http://lincccc.blogspot.tw/2011/03/cuda-cuts-fast-graph-cuts-on-gpu_03.html 现在需要代理才能访问,所以就转载了. ...
- 初探linux子系统集之写在前言
毕业两周年,进入嵌入式linux这个行业也已两个年头有余,从开始的linux驱动,android的framework,到现在的linux应用,android的app以及产品的零零总总,其实很想把这些都 ...
- Linux进程快照相关知识
查寻内核版本 uname -a // uname -r 进程快照 ps report a snapshot of the current processes USER ...