博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring 注解<context:annotation-config> 和 <context:component-scan>的作用与区别
阅读量:7223 次
发布时间:2019-06-29

本文共 3665 字,大约阅读时间需要 12 分钟。

<context:annotation-config> 是用于激活那些已经在spring容器里注册过的bean(无论是通过xml的方式还是通过packagesanning的方式)上面的注解。(激活@Resource和@Autowired注解)

<context:component-scan>除了具有<context:annotation-config>的功能之外,<context:component-scan>还可以在指定的package下扫描以及注册javabean 。(激活@Resource和@Autowired注解,同时可以配置扫描的包以激活@Service、@Controller等注解)

 

1.<context:component-scan>的作用:(开发中用这一个足以)

  一方面可以配置扫描注解的包的路径,另一方面具有<context:annotation-config>的作用,也就是可以实现注解注入(Autowired与Resource等注解)。

例如:

目录结构:

    

 

 

ApplicationContext-test.xml

 

 

package cn.qlq.test.dao;import org.springframework.stereotype.Repository;/** * @Author: qlq * @Description * @Date: 22:49 2018/9/28 */@Repositorypublic class UserDao {    public void saveUser() {        System.out.println("save user");    }}

 

 

package cn.qlq.test.service;import cn.qlq.test.dao.UserDao;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;/** * @Author: qlq * @Description * @Date: 22:52 2018/9/28 */@Servicepublic class UserService {    @Autowired    private UserDao userDao;    public void saveUser() {        userDao.saveUser();    }}

 

 

 测试类:

package cn.qlq.test;import cn.qlq.test.service.UserService;import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;/** * @Author: qlq * @Description * @Date: 22:54 2018/9/28 */public class TestApp {    public static void main(String[] args) {        ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("ApplicationContext-test.xml");        //第一种:用beanId获取bean//        UserService userService = (UserService) applicationContext.getBean(UserService.class);        //第二种:用bean的class获取bean        UserService userService = (UserService) applicationContext.getBean(UserService.class);        userService.saveUser();    }}

 

 

结果:

 save user

 

 补充:

  <context:component-scan....可以扫描多个包,逗号隔开就行,而且扫描包的时候会自动扫描子包。如下也是正确的:

 

 

2.<context:annotation-config>的作用与测试

  <context:annotation-config> 是用于激活那些已经在spring容器里注册过的bean(无论是通过xml的方式还是通过package sanning的方式)上面的注解。也就是激活@Autowired和@Resource注解。但是不会扫描@Service等注解配置的bean。

如下:

 

 

package cn.qlq.test.dao;import org.springframework.stereotype.Repository;/** * @Author: qlq * @Description * @Date: 22:49 2018/9/28 */public class UserDao {    public void saveUser() {        System.out.println("save user");    }}

 

 

package cn.qlq.test.service;import cn.qlq.test.dao.UserDao;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;/** * @Author: qlq * @Description * @Date: 22:52 2018/9/28 */public class UserService {    @Autowired    private UserDao userDao;    public void saveUser() {        userDao.saveUser();    }}

 

 

测试代码同上,可以正常运行。

 

如果我们修改xml为下面:(去掉bean定义)

 

结果报错没有找到bean:

Exception in thread "main" org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [cn.qlq.test.service.UserService] is defined    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:371)    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:331)    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:972)    at cn.qlq.test.TestApp.main(TestApp.java:17)

 

 

 

修改xml为如下:(去掉annotation-config标签)

 

 

结果会报空指针异常,service中没有注入dao:

Exception in thread "main" java.lang.NullPointerException    at cn.qlq.test.service.UserService.saveUser(UserService.java:17)    at cn.qlq.test.TestApp.main(TestApp.java:18)

 

转载地址:http://lhqym.baihongyu.com/

你可能感兴趣的文章
文件系统的简单操作
查看>>
xtrabackup 安装
查看>>
一步步学习EF Core(1.DBFirst)
查看>>
php 例子 如何转换ISO8601为 utc时间
查看>>
第四次实验
查看>>
IOS UIView 03- 自定义 Collection View 布局
查看>>
instantclient的使用入门
查看>>
【数据结构作业心得】4-1 指针笔记
查看>>
oracle拼接字段用||
查看>>
rabbitmq /usr/lib/rabbitmq/bin/rabbitmq-server: line 85: erl: command not found
查看>>
编程语言学习清单
查看>>
IO流的复习笔记
查看>>
MySQL Connector Net连接vs2012问题
查看>>
LeetCode – Refresh – Merge Intervals
查看>>
UDP编程简单案例
查看>>
Exce信息提取
查看>>
基于c的简易计算器一
查看>>
POJ1995 ZOJ2150 Raising Modulo Numbers【快速模幂】
查看>>
NTT学习笔记
查看>>
online_judge_1051
查看>>