Spring IOC容器装配Bean_基于注解配置方式
bean的实例化
1.导入jar包(必不可少的)
2.实例化bean
- applicationcontext.xml(xml的写法)
<bean id="userdao" class="com.igeekhome.dao.impl.userdao"></bean>
- 注解的写法
第一种:在 applicationcontext.xml中开启注解扫描(同时引入context命名空间)
<?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:context="http://www.springframework.org/schema/context" xsi:schemalocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> <!--开启注解扫描 context:component-scan 配置spring ioc容器开启注解扫描,扫描指定包下的@component修饰的类,将这些类的对象创建交给spring ioc容器完成 base-package: 需要扫描哪些包(及其子包) --> <context:component-scan base-package="com.igeekhome"></context:component-scan> </beans>
第二种:@component、@service、@controller、@repository 用于实例化bean
spring3.0为我们引入了组件自动扫描机制,它可以在类路径底下寻找标注了@component、@service、@controller、@repository注解的类,并把这些类纳入进spring容器中管理
@service、@controller、@repository是@component衍生的子注解
- @repository用于标注数据访问组件(如dao层组件)
- @service用于标注业务层组件(如service层)
- @controller用于标注控制层组件(如struts中的action层)
- @component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注
/* 注解:添加在实现类上(思想同配置文件) @component 等价于 <bean id="userdaoimpl" class="com.igeekhome.dao.impl.userdaoimpl"></bean> id:默认是类名(首字母小写) value:bean的id @component(value = "userdao") @component("userdao") */ @repository("userdao") public class userdaoimpl implements iuserdao { public void select() { system.out.println("userdao...select..."); } }
bean属性的依赖注入
简单数据类型依赖注入
spring3.0后,提供 @value注解,可以完成简单数据的注入
/* @component @component(value="customerservice") @service(value="customerservice") 四者都等价 */ @service("customerservice") public class customerservice { //简单类型的成员变量 @value("rose")//参数的值简单类型 private string name="jack"; //保存业务方法 public void save(){ system.out.println("customerservice业务层被调用了。。。"); system.out.println("name:"+name); } }
复杂类型数据依赖注入
1.使用@value 结合spel -- spring3.0 后用
@service("userservice") public class userserviceimpl implements iuserservice { /*<bean id="userdao" class="com.igeekhome.dao.impl.userdao"> </bean> @value("#{bean的id}") */ //写法一 (在属性声明上面注入,底层自动还是生成setuserdao()) @value("#{userdao}") private userdaoimpl userdao; //写法二 @value("#{userdao}") public void setuserdao(userdaoimpl userdao) { this.userdao = userdao; } public void list() { system.out.println("userserviceimpl...list..."); userdao.select(); } }
2.使用@autowired 结合 @qualifier
@autowired:可以单独使用,如果单独使用,按照类型进行注入(会在spring ioc容器中查找类型为com.igeekhome.dao.impl.userdaoimpl的bean并进行注入,如果找不到,肯定注入失败;如果找到匹配的单个bean,则注入成功; 如果找到多个相同类型的bean,则会选择其中一个bean进行注入
@qualifier:与@autowired结合,按照名称进行注入
@autowired//默认按照类型注入的 @qualifier("userdao")//必须配合@autowired注解使用,根据名字注入 private userdaoimpl userdao;
3.jsr-250标准(基于jdk) 提供注解@resource
如果没有指定name属性,那么先按照名称(注解修饰的属性名)进行注入,在容器中查找bean的name/id为userdao的bean,如果找到,则注入成功。如果按照名称进行注入没有找到相对应的bean,那么就会使用按照类型进行装配,如果没有改类型,则注入失败,抛出异常;如果容器中存在单个该类型的bean,则注入成功;如果容器中存在多个相同类型bean,则注入失败(expected single matching bean but found 2: userdaoxxx,userdaox)
如果指定了name属性,那么就只会按照name进行注入
@resource//(name="userdao") private userdaoimpl userdao;
4.jsr-330标准(jdk) 提供 @inject和@named注解(不推荐)
需要先导入 javax.inject 的 jar
使用@inject,默认按照类型注入,使用@inject和@named注解,则按照名称注入。用法与@autowired 结合 @qualifier 的用法一致
bean的初始化和销毁
1.applicationcontext.xml 中的写法
<!-- init-method:指定初始化方法 destroy-method: 指定销毁触发方法 --> <bean id="lifecycle" class="com.igeekhome.bean.lifecyclebean" scope="singleton" init-method="initmethod" destroy-method="destroymethod"></bean>
2.注解写法
使用 @postconstruct 注解, 标明初始化方法 ---相当于 init-method 指定初始化方法
使用 @predestroy 注解, 标明销毁方法 ----相当于 destroy-method 指定对象销毁方法
@repository("userdao") public class userdaoimpl implements iuserdao { public void select() { system.out.println("userdao...select..."); } //init-method @postconstruct public void init() { system.out.println("init..."); } //destory-method @predestroy public void destory() { system.out.println("destory"); } }
bean的作用域
1.applicationcontext.xml 中的写法
默认是 singleton 单例 ,prototype是多例
<bean id=”” class=”” scope=”prototype”>
2.注解写法
通过@scope注解,指定bean的作用域
@service("userservice") //@scope("singleton")默认是单列 @scope("prototype") public class userserviceimpl implements iuserservice { }
备注
只有在spring配置文件中开启了注解扫描
才能使用 @component @autowired @resource @postconstruct @predestroy等注解
上一篇: 华为gt3可以拨号打电话吗 华为gt3支持sim卡吗
下一篇: mysql数据库密码忘记解决方法
推荐阅读
-
02Spring基于xml的IOC配置--实例化Bean的三种方式
-
Spring的IOC控制反转实现注解方式配置
-
Spring5参考指南:基于注解的容器配置
-
Spring Ioc与Aop注解方式配置
-
Spring IOC容器装配Bean_基于注解配置方式
-
史上最简单的 Spring 教程 | 第四篇:基于注解的IOC配置
-
Spring IOC容器装配Bean_基于XML配置方式
-
Spring源码分析-从@ComponentScan注解配置包扫描路径到IoC容器中的BeanDefinition,经历了什么(一)?
-
Spring 整体学习(IOC容器 DI依赖注入 AOP 面向切面编程(动态代理) 配置注入 注解注入 )
-
Spring IOC容器-Bean管理——基于XML方式(续集)