spring入门-注解

文章目录


spring中的注解是用来代替xml中繁琐的配置而生的。本文从原始注解和新注解两方面来说明注解的使用。

1 原始注解

applicationContext.xml中指定需要扫描的包或类,spring来识别使用注解配置的类、字段和方法。

<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">
    <!--扫描com.test包下所有的类-->
    <context:component-scan base-package="com.test"/>
</beans>

1.1 实例化对象的注解

<bean>用来定义将类对象的创建交由spring容器来完成,相应的注解有如下几个(根据实际情况选择一个使用):

注解 说明
@Component 可在所有类上使用
@Controller 在controller类上使用,同时起到标注的作用
@Service 在service类上使用,同时起到标注的作用
@Repository 在dao类上使用,同时起到标注的作用

测试@Repository

@Repository("testDao")
public class TestDaoImp implements TestDao {

    public void queryAll() {
        System.err.println("queryAll执行了");
    }

    public static void main(String[] args) {

        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        TestDao testDao = (TestDao) applicationContext.getBean("testDao");
        testDao.queryAll();
    }
}

测试结果:
spring入门-注解

1.2 依赖注入的注解

使用set进行依赖注入方式时,<bean>下使用<property>进行注入,使用构造方法注入时,<bean>下使用<constructor-arg>进行注入,以下几个注解就能解决繁琐的依赖注入配置问题。

注解 说明
@Autowired 在字段上使用,根据类型注入
@Qualifier 必须和@Autowired一起使用,根据名称进行注入
@Value 注入普通数据类型值,主要用于获取配置文件中的属性值

测试@Autowired+@Qualifier

@Service("testService")
public class TestServiceImp implements TestService {

    @Autowired
    @Qualifier("testDao")
    private TestDao testDao;
    public void findAll() {
        testDao.queryAll();
        System.out.println("findAll执行了");
    }
    public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        TestService testService = (TestService) applicationContext.getBean("testService");
        testService.findAll();
    }
}

测试结果:
spring入门-注解

拓展
@Resource,和【@Autowired+@Qualifier】作用相同,但是需要增加依赖。

<dependency>
        <groupId>javax.annotation</groupId>
        <artifactId>javax.annotation-api</artifactId>
        <version>1.3.2</version>
</dependency>

1.3 其他

@Scope 在类上使用标注作用范围,同<bean>中的scope属性,@Scope 注解value值说明:

value 说明
singleton 单例,不加@Scope(“singleton”)也是单例模式创建对象,随着spring容器的存在而存在
prototype 多例,对象使用时创建,对象长时间不使用会被JVM回收
request 同一个request请求创建一个实例对象
session 同一个session会话创建一个实例对象

拓展
javax.annotation下的注解:

注解 说明
@PostConstruct 在方法上使用,标注类的初始化方法
@PreDestroy 在方法上使用,标注类的销毁方法

2 新注解

2.1 去掉applicationContext.xml

注解 说明
@Configuration 指定当前类是一个配置类,替代applicationContext.xml文件
@ComponentScan 组件扫描,替代<context:component-scan>
@Import 导入其他配置类,替代<import>。

测试
注意:先将applicationContext.xml文件删除或者换个文件名。

//配置类
@Configuration
@ComponentScan("com.test.dao")
public class ApplicationConfig {

}
//测试类,使用AnnotationConfigApplicationContext读取配置
@Repository("testDao")
public class TestDaoImp implements TestDao {

    public void queryAll() {
        System.err.println("queryAll执行了");
    }
    @PostConstruct
    public void init(){
        System.out.println("testDao初始化开始");
    }
    @PreDestroy
    public void destroy(){
        System.err.println("testDao被销毁了");
    }

    public static void main(String[] args) {

        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(ApplicationConfig.class);
        TestDao testDao = (TestDao) applicationContext.getBean("testDao");
        testDao.queryAll();
    }
}

2.2 其他

注解 说明
@PropertySource 用在类上,用于加载.properties 文件中的配置,替代<context:property-placeholder>
@Bean 用在方法上,方法的返回值一般为非自定义的Bean的实例对象,返回值存储到 Spring 容器中,替代<bean>。

测试

//主配置文件
@Configuration
@ComponentScan("com.test.dao")
@Import({UserConfig.class})
public class ApplicationConfig {

}
//子配置文件
@PropertySource("classpath:user.properties")
public class UserConfig {

    @Value("${username}")
    private String username;

    @Bean(name="authPermission")
    public AuthPermission getAuthPermission(){
        //AuthPermission为javax.security.auth包下的类,非自定义的类
        return new AuthPermission(username);
    }

    public static void main(String[] args) {
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(ApplicationConfig.class);
        AuthPermission authPermission = (AuthPermission)applicationContext.getBean("authPermission");
        System.out.println(authPermission.toString());
    }

}

user.properties文件中:

username=root

测试结果:
spring入门-注解

3 使用junit测试

3.1 引入依赖

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>5.3.13</version>
</dependency>
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>

3.2 测试程序

@RunWith(SpringJUnit4ClassRunner.class)
//@ContextConfiguration(value = {"classpath:applicationContext.xml"})
@ContextConfiguration(classes = {ApplicationConfig.class})
public class TestSpring {
    @Autowired
    private TestDao testDao;
    @Test
    public void testDao(){
        testDao.queryAll();
    }
}

测试结果:
spring入门-注解

上一篇:移动测试概论(1)


下一篇:【架构师面试-Java编程基本功-12】-Spring之IOC与容器