java之Spring装配Bean(手动装配、自动装配、注解装配)

在上一篇控制反转中我们看到了依靠一个Bean文件来实现对代码的控制,可谓十分便捷,再也不用去实例化对象了,2333~~~

1.手动装配

1 <bean id="todo" class="com.eco.daoimp.Usertodo1"></bean>
2
3 <!--定义Userservice类内部接口的引用(userdao)指向具体的实现类对象(Usertodo1) -->
4 <bean id="userservice" class="com.eco.service.Userservice">
5      <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" />   
3 <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文件要较之前有个改变:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
 4     xmlns:context="http://www.springframework.org/schema/context"
 5     xsi:schemaLocation="http://www.springframework.org/schema/beans
 6     http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
 7     http://www.springframework.org/schema/context
 8     http://www.springframework.org/schema/context/spring-context-3.1.xsd">
 9
10     <context:component-scan base-package="com.eco"></context:component-scan>11 </beans>

红字是较之前手动装配/自动装配新增的声明字段,然后内部只有一个标签,这个标签告诉容器要解析哪个包下的bean。

 1 @Service
 2 public class Userservice {
 3     // 定义接口的引用
 4     private UserDao userdao;
 5
 6     // 定义setter方法,设置接口的引用指向哪个实现类的对象
 7     @Autowired
 8     public void setUserdao(UserDao userdao) {
 9         this.userdao = userdao;
10     }
11
12     public void useradd(User newuser) {
13         // 此时的userdao经过spring依赖注入之后已经实现指向特定的接口实现类对象
14         // 那么调用接口的方法,实际上是调用了特定实现类的方法的
15         userdao.adduser(newuser);
16     }
17 }
 1 @Repository
 2 public class Usertodo1 implements UserDao {
 3     // 接口实现类为方法添加方法体
 4     public void adduser(User user) {
 5         // 利用Hibernate的工厂类获得Session对象和事务对象Transaction
 6         Session session = HibernateSessionFactory.getSession();
 7         Transaction transaction = session.beginTransaction();
 8         // 数据库添加用户操作
 9         session.save(user);
10         // 提交事务
11         transaction.commit();
12         // 关闭session对象
13         session.close();
14         System.out.println("todo1 create the user");
15     }
16 }

红字标注的三个注解意思就是:为@Service声明的Userservice类,内部的@Autowired声明的userdao变量,注入了

@Repository声明的Usertodo1实现类。

依赖注入有①接口注入②setter注入③构造方法注入,很明显上面的例子是setter注入,

接口注入就将注解写在定义的成员变量上;

setter注入就将注解写在setter方法上;

构造方法注入就将注解写在构造方法上(很明显上面没有定义构造方法)。

调用的时候方法还是和之前一样:

 1 public class Test1 {
 2     @Test
 3     public void add() {
 4         // Spring读取beans。xml文件
 5         ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
 6         // 解析id为userservice的bean标签,内部实现UserDao userdao = new Usertodo1()
 7         Userservice service = (Userservice) ctx.getBean("userservice");
 8         User newuser = new User("桔子桑", 31);
 9         // 此时调用的useradd()方法,就是接口实现类Usertodo1的useradd()方法
10         service.useradd(newuser);
11     }
12 }

只是这个bean的名称,默认是采用@Service声明的类的名称首字母小写,其余不变作为bean的id/name;

我们也是可以自定义这个bean名称的,@Service("eco"),像这样在括号里就可以自定义名称了。

时间: 2024-10-09 07:02:28

java之Spring装配Bean(手动装配、自动装配、注解装配)的相关文章

java获取spring的bean

/** * 加载spring配置文件,提供getBean接口. * @author xiongzy * */ public final class BeanLocator { private static final Logger logger = Logger.getLogger(BeanLocator.class); /** * 单实例. */ private static BeanLocator instance = null; /** * 缺省配置文件名称. */ private sta

自定义的Spring Boot starter如何设置自动配置注解

本文首发于个人网站:自定义的Spring Boot starter如何设置自动配置注解 在Spring Boot实战之定制自己的starter一文最后提到,触发Spring Boot的配置过程有两种方法: spring.factories:由Spring Boot触发探测classpath目录下的类,进行自动配置: @Enable:有时需要由starter的用户触发*查找自动配置文件的过程. 实战 接着上篇文章的例子,首先将spring.factories中的内容注释掉 #org.springf

spring:按照Bean的名称自动装配User

本实例将介绍如何按照Bean 的名称自动装配 User 对象! <bean> 元素的 autowire 属性负责自动装配 <bean> 标签,定义 JavaBean 的属性.这样做可以省去很多配置 JavaBean 属性的标签代码,使代码更整洁.美观: 但是也有负面影响:使用自动装配之后,无法从配置文件中读懂 JavaBean 需要什么属性. 1.编写User 对象,代码如下: package com.importnew; public class User { private S

Spring学习(六)bean装配详解之 【通过注解装配 Bean】【基础配置方式】

通过注解装配 Bean 1.前言 优势 1.可以减少 XML 的配置,当配置项多的时候,XML配置过多会导致项目臃肿难以维护 2.功能更加强大,既能实现 XML 的功能,也提供了自动装配的功能,采用了自动装配后,程序猿所需要做的决断就少了,更加有利于对程序的开发,这就是“约定优于配置”的开发原则 IOC发现Bean的两种方式 组件扫描:通过定义资源的方式,让 Spring IoC 容器扫描对应的包,从而把 bean 装配进来. 自动装配:通过注解定义,使得一些依赖关系可以通过注解完成. 2.使用

JAVAWEB开发之Spring详解之——Spring的入门以及IOC容器装配Bean(xml和注解的方式)、Spring整合web开发、整合Junit4测试

Spring框架学习路线 Spring的IOC Spring的AOP,AspectJ Spring的事务管理,三大框架的整合 Spring框架概述 什么是Spring? Spring是分层的JavaSE/EE full-stack(一站式)轻量级开源框架. 所谓分层: SUN提供的EE的三层结构:web层.业务层.数据访问层(也称持久层,集成层). Struts2是web层基于MVC设计模式框架. Hibernate是持久的一个ORM的框架. 所谓一站式:Spring框架有对三层的每层解决方案.

Spring_总结_03_装配Bean(二)之Java配置

一.前言 本文承接上一节:Spring_总结_03_装配Bean(一)之自动装配 上一节提到,装配Bean有三种方式,首先推荐自动装配.当自动装配行不通时,就需要采用显示配置的方式了. 显示配置有两种方案:Java 和 XML.当需要显示配置时,首选类型安全并且比XML更强大Java配置. 二.Java配置 实现Java配置只需两步: (1)使用@Configuration声明一个配置类 (2)在配置类中使用@Bean声明一个Bean,同时可通过方法名注入bean. 三.Java配置实例 pac

Spring框架装配Bean的三种方式

欢迎查看Java开发之上帝之眼系列教程,如果您正在为Java后端庞大的体系所困扰,如果您正在为各种繁出不穷的技术和各种框架所迷茫,那么本系列文章将带您窥探Java庞大的体系.本系列教程希望您能站在上帝的角度去观察(了解)Java体系.使Java的各种后端技术在你心中模块化:让你在工作中能将Java各个技术了然于心:能够即插即用.本章我们来一起了解Spring专栏-SpringBean装配. 本章我们一起来探讨SpringBean的装配,所谓 "装配" 就是值将Bean安装Bean容器中

Spring常用注解,自动扫描装配Bean

1 引入context命名空间(在Spring的配置文件中),配置文件如下: Xml代码   xmlns:context="http://www.springframework.org/schema/context" http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd 打开配置 <context:comp

装配bean

spring有三种装配bean的方式:隐式装配.java代码装配.xml装配 隐式装配最为省事方便,也称为自动化装配 这三种装配方式可以混搭着来用 在这里通过一个例子来讲述配置 CD的两个实现,一个是ThinkingJAVA,一个是LinuxBird注解配置定义bean @Component public class ThinkingJAVA{ public void play(){ System.out.println("java思想"); } } 在这里ThinkingJAVA被C

IOC装配Bean(注解方式)(5)

Spring的注解装配Bean Spring2.5 引入使用注解去定义Bean @Component 描述Spring框架中Bean Spring的框架中提供了与@Component注解等效的三个注解: @Repository 用于对DAO实现类进行标注 @Service 用于对Service实现类进行标注 @Controller 用于对Controller实现类进行标注 ***** 三个注解为了后续版本进行增强的. Bean的属性注入: 普通属性; @Value(value="itcast&q