欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Spring IOC容器装配Bean_基于注解配置方式

程序员文章站 2022-06-22 15:19:56
bean的实例化 1.导入jar包(必不可少的) 2.实例化bean applicationContext.xml(xml的写法) 注解的写法 第一种:在 applicationContext.xml中开启注解扫描(同时引入context命名空间) 第二种:@Component、@Service、@ ......

bean的实例化

1.导入jar包(必不可少的)
Spring IOC容器装配Bean_基于注解配置方式

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等注解