继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

专题二:Bean(注解配置)---- Spring入门

时间啊
关注TA
已关注
手记 19
粉丝 97
获赞 582
专题二:Bean(注解配置)---- Spring入门
  • Bean 定义及作用域的注解实现
    • Classpath 扫描与组件管理
    • 类的自动检测与注册 Bean
    • <context: annotation-config/>
    • @Component, @Repository, @Service, @Controller
  • Autowired 注解说明
    • @Required
    • @Autowired
    • @Qualifier
    • @Resource
  • 基于 Java 的容器注解说明
  • Spring 对 JSR 支持的说明

<!--more-->

Bean 定义及作用域的注解实现

Classpath 扫描与组件管理

  • Spring3.0 开始,可以使用 Java 定义 Bean (以前使用XML)eg: Configuration, @Bean, @Import, @DependsOn
  • @Component 是通用注解,可用于任何 Bean
  • @Repository, @Service, @Controller 针对性注解
    • @Repository 注解 DAO 类,即持久层
    • @Service 通常注解 Service 类,即服务层
    • @Controller 注解 Controller 类,即控制层(MVC)

元注解(Meta-annotations)

  • 元注解:注解的注解,Spring 提供的注解可以作为自己的代码,即“元数据注解”
  • 元注解可以应用到另一个注解中
  • 元注解可以有其他属性,允许定制

类的自动检测及 Bean 的注册

  • Spring 可以自动检测类并注册 Bean 到 ApplicationContext 中
    注解在类,方法或者成员变量上都可以自动检测
  • 为了能检测这些类并注册相应的 Bean,需要添加
    ‘<context: component-scan base-package="org.example">’
  • <context: component-scan>包含<context: annotation-config>,使用前者后不使用后者,通常使用前者

<context: annotation-config/>配置介绍

  • 配置在 Spring 的 XML 中
  • 作用:仅会查找在同一个 applicationContext 中的 bean 注解

使用过滤器自定义扫描

  • 使用过滤器修改注解扫描
  • 可以使用 use-default-filters= "false" 禁用自动发现与注册

定义 Bean

  • 扫描过程中组件被自动检测,Bean 的名称由 BeanNameGenerator 生成
  • 自定义命名,实现 BeanNameGenerator 接口(包含无参构造器)
    在 beans 中配置

    Bean 的作用域

  • Spring2.5 提供标识scope的注解 @Scope
  • 自定义 scope 策略,实现 ScopeMetadataResolver 接口(包含无参构造器)
    在 beans 中配置

代理方式

  • 使用 scoped-proxy 属性指定代理,三个值 no/interfaces/targetClass

Bean 定义和作用域实现例子(对应上一篇例子)

BeanAnnotation 类

package com.imooc.beanannotation;

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

//@Component("bean")
@Scope
@Component
public class BeanAnnotation {

  public void say(String arg) {
  System.out.println("BeanAnnotation : " + arg);
  }

  public void myHashCode() {
  System.out.println("BeanAnnotation : " + this.hashCode());
  }

}

单元测试类

package com.imooc.test.beanannotation;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.BlockJUnit4ClassRunner;

import com.imooc.beanannotation.BeanAnnotation;
import com.imooc.test.base.UnitTestBase;

@RunWith(BlockJUnit4ClassRunner.class)
public class TestBeanAnnotation extends UnitTestBase {

    public TestBeanAnnotation() {
        super("classpath*:spring-beanannotation.xml");
    }

    @Test
    public void testSay() {
        BeanAnnotation bean = super.getBean("beanAnnotation");
        bean.say("This is test.");

//        bean = super.getBean("bean");
//        bean.say("This is test.");
    }

    @Test
    public void testScpoe() {
        BeanAnnotation bean = super.getBean("beanAnnotation");
        bean.myHashCode();

        bean = super.getBean("beanAnnotation");
        bean.myHashCode();
    }

}

spring-beanannotation.xml 配置文件

<?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
  http://www.springframework.org/schema/context/spring-context.xsd" >

  <context:component-scan base-package="com.imooc.beanannotation"></context:component-scan>

 </beans>
Autowired 注解说明

@Required

  • @Required 注解适用于 Bean 属性的 setter 方法
  • 受影响的 Bean 属性必须在配置时被填充

@Autowired

  • 可以将 @Autowired 注解为“传统”的 setter 方法
  • 可用于构造器或者成员变量 (用于成员变量或者 set 方法相当于设置注入,用于构造器相当于构造注入)
  • 可以使用 @Autowired(required=false) 避免找不到合适的 bean
  • 每个类只存在一个构造器 required=true
  • @Autowired 的必要属性,建议使用 @Required 注解
  • 可以使用 @Autowired 注解解析依赖性接口,可以直接获取 Spring 资源
    eg:BeanFactory,ApplicationContext,Environment,ResourceLoader,ApplicationEventPublisher and MessageSource

  • 可以用于集合框架,为集合中所有 bean 注册,实现 org.springframework.core.Ordered 接口或者 @Order 注解使其有序(list)

注意:@Autowired 由 Spring BeanPostProcessor 处理,所以自己定义是不能使用该注解,可以供过 XML 或者 @Bean 注解加载

@Qualifier

  • 按类型自动装备多个 Bean 实例,用于构造器参数或者方法参数或者成员变量
  • 注解集合类型变量
    注解使用
    xml使用

@Resource(JSR-250 推荐使用)

  • @Autowired 按 byType 自动注入,而 @Resource 默认按 byName 自动注入罢了
  • @Resource 两个重要属性 name 和 type
  • 需要在 xml 中加入
    <bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor" />
基于 java 的容器注解
  • @Bean 标识用于配置和初始化新对象 类似 xml 中<bean/>
  • 使用 @Configuration 注解类 ,@Bean(name="")

参考文档
Spring 注解大全

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP