当前位置: 移动技术网 > IT编程>开发语言>Java > Spring IOC容器装配Bean_基于注解配置方式

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

2019年12月06日  | 移动技术网IT编程  | 我要评论

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网