第四章:Spring基于注解配置

一)Spring注解配置

在spring XML配置中,注解连线在默认情况下不打开,需要在配置中显示配置。

<context:annotation-config/>

 

二)Spring常用注解

1、@Component

作用:

把资源让spring来管理。相当于在xml中配置一个 bean。相当于:<bean id="" class="">

属性:

value:指定bean的 id。如果不指定value属性,默认bean的id是当前类的类名,首字母小写。

衍生注解:和@Component作用一样,只是提供了更加明确的语义化。

@Controller:一般用于表现层的注解。

@Service:一般用于业务层的注解。

@Repository:一般用于持久层的注解。

 

2、数据注入注解

相当于:<property name="" ref=""> <property name="" value="">

@Autowired

作用:按照byType注入。当使用注解注入属性时,set方法可以省略。它只能注入其他bean类型。当有多个类型匹配时,使用要注入的对象变量名称作为bean的id,在spring容器查找,找到了也可以注入成功。找不到就报错。

@Qualifier

在@Autowired注解的基础上,再按照bean的id注入,必须和@Autowire 一起使用。但是给方法参数注入时,可以独立使用。

@Resource

直接按照bean的id注入,相当于byName注入。它也只能注入其他bean类型。

@Value

注入基本数据类型和String类型数据的,常用于配置文件中的属性注入。

 

3、@Scope

作用:指定bean的作用范围。

取值:singleton、prototype、request、session、globalsession

 

4、bean生命周期注解

@PostConstruct

作用: 用于指定bean初始化之前的执行方法。

@PreDestroy

作用: 用于指定bean销毁之后的执行方法。

 

5、@Configuration

作用:用于指定当前类是一个spring配置类,当创建容器时会从该类上加载注解。获取容器时需要使用 AnnotationApplicationContext(有@Configuration 注解的类.class)。

相当于:spring-config.xml配置文件

属性:value用于指定配置类的字节码

 

6、@ComponentScan

作用:用于指定spring在初始化容器时要扫描的包。作用和在spring的xml配置文件中的: <context:component-scan base-package="com.oysept"/> 是一样的。

属性:basePackages用于指定要扫描的包。和该注解中的value属性作用一样。

 

7、@Bean

作用:该注解只能写在方法上,用于把当前方法的返回值作为bean对象存入spring的ioc容器中。

属性:name给当前@Bean注解方法创建的对象指定一个名称(即 bean 的 id)。当不写时,默认值是当前方法的名称。

 

8、@PropertySource

作用:用于加载properties文件中的配置。

属性:value[]用于指定properties文件位置。如果是在类路径下,需要写上classpath。

 

9、@Import

作用:用于导入其他配置类,在引入其他配置类时,可以不用再写@Configuration注解。当然,写上也没问题。

属性:value[]用于指定其他配置类的字节码。

 

三)Spring注解案例

第一步:创建一个maven项目,在pom.xml中导入spring和jar

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.2.5.RELEASE</version>
</dependency>

 

第二步:在resources下创建一个spring_config.properties文件,用于测试@Value注解

spring.config.msg.id=111
spring.config.msg.name=AAA

spring.config.message.id=222
spring.config.message.name=BBB

 

第三步:创建spring注解的配置文件

PropertiesConfig.java:用于读取spring_config.properties文件中的信息

package com.oysept.config;

import java.util.Properties;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.PropertySource;
import org.springframework.context.annotation.Scope;

/**
 * @PropertySource: 用于加载后缀为".properties"文件中的配置,
 * @author ouyangjun
 */
@PropertySource("classpath:spring_config.properties")
public class PropertiesConfig {

    /**
     * @Value: 获取配置文件中的属性值, 当值不存在时,提供一个默认值
     */
    @Value(value="${spring.config.msg.id:0}")
    private String firstID;
	
    @Value(value="${spring.config.msg.name:no}")
    private String firstName;
	
    @Value(value="${spring.config.message.id:0}")
    private String secondID;
	
    @Value(value="${spring.config.message.name:no}")
    private String secondName;
	
    @Bean(name="properties_first")
    @Scope("singleton")
    public Properties createProperties1() {
        Properties pro = new Properties();
        pro.put(firstID, firstName);
        return pro;
    }
	
    @Bean(name="properties_second")
    @Scope("singleton")
    public Properties createProperties2() {
        Properties pro = new Properties();
        pro.put(secondID, secondName);
        return pro;
    }
}

SpringConfigXML.java文件,相当于XML中spring-config.xml

package com.oysept.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

/**
 * @Configuration: 相当于:spring-config.xml配置文件
 * @ComponentScan: 相当于:<context:component-scan base-package="com.oysept"/>
 * @Import: 把其它配置文件导入, 当指定加载SpringConfigXML配置时, 会自动加载其它配置文件
 * @author ouyangjun
 */
@Configuration
@ComponentScan("com.oysept")
@Import(PropertiesConfig.class)
public class SpringConfigXML {
	
}

 

第四步:创建bean文件

MessageChecker.java

package com.oysept.service;

import org.springframework.stereotype.Component;

/**
 * @Component: 相当于:<bean id="" class="">
 * @author ouyangjun
 */
@Component
public class MessageChecker {

    public void printMessage() {
        System.out.println("AnnotationConfig MessageChecker printMessage()!");
    }
}

MessageService.java

package com.oysept.service;

import java.util.Properties;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

/**
 * @Component: 相当于:<bean id="" class="">
 * @author ouyangjun
 */
@Component
public class MessageService {
	
    /**
     * @Autowired: 相当于:<property name="" ref=""> <property name="" value="">
     */
    @Autowired
    private MessageChecker messageChecker;
	
    /**
     * @Qualifier: 当存在多个bean时, 需指定具体的bean, 如多配置, 多数据源的场景
     */
    @Autowired
    @Qualifier(value = "properties_second")
    private Properties properties;

    public void printProperty() {
        System.out.println("properties: " + properties);
        messageChecker.printMessage();
    }
}

 

第五步:创建测试文件

package com.oysept.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import com.oysept.config.PropertiesConfig;
import com.oysept.config.SpringConfigXML;
import com.oysept.service.MessageService;

public class MsgTest {

    public static void main(String[] args) {
        // 方式1.获取容器, 当有多个配置文件时, 如不用@Import注解, 可用该方式注册
        //ApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfigXML.class, PropertiesConfig.class);
        
        // 方式2.获取容器
        AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext();
        ac.register(SpringConfigXML.class, PropertiesConfig.class); // 注册配置文件
        ac.refresh(); // 刷新配置信息
        
        // 方式3.获取容器
        //ApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfigXML.class);
        
        // 2.得到业务层对象, 并执行方法
        MessageService msgA = ac.getBean(MessageService.class);
        msgA.printProperty();
    }
}

打印效果图:

 

识别二维码关注个人微信公众号

本章完结,待续,欢迎转载!
 
本文说明:该文章属于原创,如需转载,请标明文章转载来源!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值