spring 定义bean与自动注入

一、定义bean的三种方式

1、基于XML的bean定义

具体的有上一个博客提到的setter注入,构造器注入等五种方式

2、基于注解的bean定义

1、  元注解:@Component     

       @Target(ElementType.TYPE)

       @Component是所有受Spring 管理组件的通用形式,@Component注解可以放在类的头上,@Component不推荐使用。

2、@Controller(控制层)

@Target(ElementType.TYPE)

@Controller对应表现层的Bean,也就是Action

3、Service业务层

        @Target(ElementType.TYPE)

        @Service对应的是业务层Bean

4、@ Repository(数据访问层)

        @Target(ElementType.TYPE)

        @Repository对应数据访问层Bean

使用以上注解标识User之后,就表示要把User交给Spring容器管理,在Spring容器中会存在一个名字为"user"的bean,这个名字是根据Use类名来取的(首字母小写)。

3、基于Java类的bean定义

  1. 使用@Configuration注解需要作为配置的类,表示该类将定义Bean的元数据
  2. 使用@Bean注解相应的方法,该方法名默认就是Bean的名称,该方法返回值就是Bean的对象。
  3. AnnotationConfigApplicationContext或子类进行加载基于java类的配置
@Configuration  
public class BeansConfiguration {  

    @Bean  
    public Student student(){  
        Student student=new Student();  
        student.setName("张三");  
        student.setTeacher(teacher());  
        return student;  
    }  

    @Bean  
    public Teacher teacher(){  
        Teacher teacher=new Teacher();  
        teacher.setName("李四");  
        return teacher;  
    }  
}

二、spring bean的自动装配

1、基于XML的自动装配

autowire指定自动注入的方式,具体的注入方式是上一个博客中提到的setter注入等。

default-autowire:指定默认的自动注入方式

  • no:默认值。表示不进行自动注入。
  • byName:根据名称进行自动注入。如beanA有一个setBeanB()方法,指定autowire=”byname”时Spring将自动在bean容器中寻找名为“beanB”的bean通过setBeanB方法自动注入给beanA。
  • byType:根据类型进行自动注入。如beanA有一个setBeanB()方法,指定autowire=”byType”时Spring将自动在bean容器寻找类型为BeanB的bean通过setBeanB()方法注入给beanA。但是如果此时容器中有两个以上类型为BeanB的bean时就将抛出异常。
  • constructor:等同于byType,只是当指定autowire=”constructor”时表示将通过构造方法根据类型进行自动注入。
<?xml version="1.0" encoding="UTF-8"?>  
<beans xmlns="http://www.springframework.org/schema/beans"  
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
       xsi:schemaLocation="http://www.springframework.org/schema/beans  
       http://www.springframework.org/schema/beans/spring-beans.xsd">  
  
    <bean id="student" class="test.Student" autowire="byName">  
        <property name="name" value="张三"/>  
    </bean>  
  
    <bean id="teacher" class="test.Teacher">  
        <property name="name" value="李四"/>  
    </bean>  
  
</beans>

bean中的ref 属性是在一个bean中引用另一个bean

<bean class="dao.UserDaoImpl" id="userDao"/>



<bean class="service.UserServiceImpl" id="userService">

    <property name="userDao" ref="userDao"/>

</bean>

 

2、基于注解的自动装配

使用注解来构造IoC容器

用注解来向Spring容器注册Bean。需要在applicationContext.xml中注册<context:component-scan base-package=”pagkage1[,pagkage2,…,pagkageN]”/>。

<context:component-scan base-package="annotation"/>

 

指定相应的包名,扫描相应的包如果某个类的头上带有特定的注解【@Component/@Repository/@Service/@Controller】,就会将这个对象作为Bean注册进Spring容器。

(1)@Autowired

@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE}) 

一般放在属性上

​
public class UserServlet {

    @Autowired

    UserService userService;

}

​

@Autowired还可以自动注入接口的全部实现类

@Autowired

List<beaninterface> list;

@Autowired

Map<String, beaninterface> map;

自动装配,其作用是为了消除代码Java代码里面的getter/setter与bean属性中的property。

@Autowired默认按类型匹配的方式,在容器查找匹配的Bean,当有且仅有一个匹配的Bean时,Spring将其注入@Autowired标注的变量中。

(2)Qualifier(指定注入Bean的名称)

如果容器中有一个以上匹配的Bean,则可以通过@Qualifier注解限定Bean的名称

public class A {

    @Autowired

    @Qualifier("interfaceA")

    beaninterface a;

}

(3)@Required

 @Target(ElementType.METHOD)

@Required

public void setId(int id) {

    this.id = id;

}

@Required注解适用于bean属性setter方法,并表示受影响的bean属性必须在XML配置文件在配置时进行填充。否则,容器会抛出一个        BeanInitializationException异常。

(4)@Resource

与@Autowired使用方法基本相同

@Resource的装配顺序:

(1)、@Resource后面没有任何内容,默认通过name属性去匹配bean,找不到再按type去匹配

(2)、指定了name或者type则根据指定的类型去匹配bean

(3)、指定了name和type则根据指定的name和type去匹配bean,任何一个不匹配都将报错

然后,区分一下@Autowired@Resource两个注解的区别:

(1)、@Autowired默认按照byType方式进行bean匹配,@Resource默认按照byName方式进行bean匹配

(2)、@Autowired是Spring的注解,@Resource是J2EE的注解,这个看一下导入注解的时候这两个注解的包名就一清二楚了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值