@ComponentScan在spring中无效的原因分析以及解决方法

技术@ComponentScan在spring中无效的原因分析以及解决方法这篇文章将为大家详细讲解有关@ComponentScan在spring中无效的原因分析以及解决方法,文章内容质量较高,因此小编分享给大家做个参考,

这篇文章将为大家详细讲解有关@组件扫描在春天中无效的原因分析以及解决方法,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

@ComponentScan在spring中无效

在我实现第一个弹簧面向切面编程程序的时候,我按照主流的推荐,采用注解@组件扫描@方面@之前来实现一个切面。

让我十分纳闷的是。我的程序始终无法正确调用到通知。而且我的通知和主流的毫无差别。代码如下:

通知类,其中定义了切面:

打包。bfytech。spring _ 8 _ bean 3;

导入组织。AspectJ。朗。注释。之后;

导入组织。AspectJ。朗。注释。方面;

导入组织。AspectJ。朗。注释。之前;

导入组织。弹簧框架。刻板印象。组件;

@Aspect

@组件

publicclassAdvice(

@ Before(' execution(* com。bfytech。春天豆3 .Person.getName(.))')

publicativtlogbeforeffect(){ 0

系统。出去。println('函数开始');

}

@After('执行(* com。bfytech。spring _ 8 _ bean 3。人。*(.))')

publicativtlogafterfunction(){ 0

系统。出去。println('函数结束');

}

}业务类:

打包。bfytech。spring _ 8 _ bean 3;

导入组织。弹簧框架。刻板印象。组件;

@组件

publicclassPerson{

私有字符串名称

私人占有;

public stringgetname(){ 0

System.out.println('getName . ');

returnname

}

public void set name(Stringname){ 0

this.name=name

System.out.println('setName . ');

}

publiintgetage(){ 0

System.out.println('getAge . ');

返回;

}

公共void setage(intage){ 0

System.out.println('setAge . ');

this.age=年龄;

}

}豆配置类:

打包。bfytech。spring _ 8 _ bean 3;

导入组织。弹簧框架。语境。注释。豆子;

导入组织。弹簧框架。语境。注释。组件可以;

导入组织。弹簧框架。语境。注释。配置;

导入组织。弹簧框架。语境。注释。enableaspectjautproxy

@配置

@EnableAspectJAutoProxy
@ComponentScan
public class BeanConfig { 
 @Bean
 public Advice advice() {
  return new Advice();
 }
}

AppicationContext.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:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:util="http://www.springframework.org/schema/util"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.3.xsd">
</beans>

最后的调用类App

package com.bfytech.spring_8_bean3; 
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
 
/**
 * Hello world!
 *
 */
public class App 
{
    public static void main( String[] args )
    {
        System.out.println( "Hello World!" );        
        ApplicationContext context = new FileSystemXmlApplicationContext("ApplicationContext.xml");
        Person person = (Person) context.getBean(Person.class);
          person.setName("Tony");
          person.setAge(88);
          System.out.println(person.getName());
          System.out.println(person.getAge());
    }
}

郁闷之余。做了大量尝试,后来发现在ApplicationContext.xml中添加如下行:

<context:component-scan base-package="com.bfytech.spring_8_bean3"></context:component-scan>

之后可以正常把AOP启动起来。

查了大量资料之后,找到了原因

原来很多资料中把xml配置和注解配置混淆在一起了!

当你采用xml配置的时候,则ApplicationContext.xml的内容会生效。但是前提是你需要采用FileSystemXmlApplicationContext或者ClassPathXmlApplicationContext去读取这个xml,配置才会生效!同时@ComponentScan会被忽略!

而当你采用注解配置的时候,则你应该使用AnnotationConfigApplicationContext来加载,这时配置类的中的@ComponentScan就会生效。

修改代码App.java为

package com.bfytech.spring_8_bean3; 
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
 
/**
 * Hello world!
 *
 */
public class App 
{
    public static void main( String[] args )
    {
        System.out.println( "Hello World!" );     
        ApplicationContext context = new AnnotationConfigApplicationContext(BeanConfig.class);
        Person person = (Person) context.getBean(Person.class);         
          person.setName("Tony");
          person.setAge(88);
          System.out.println(person.getName());
          System.out.println(person.getAge());
    }
}

运行结果正常了!

顺便说,还有一个坑。execution表达式因为没有编译时检查,任何标点符号的错误也会在运行时忽略(??我很纳闷,为什么不抛异常),所以需要反复检查。比如说下面的表达式,你觉得有错么?

@Before("execution(* com.bfytech.spring_8_bean3.*.*(**))")

这个表达式是错误的,因为(**)应该是(..).而运行时这个不会报任何错误。但是切片的代码不会运行.....

@Component和@ComponentScan常规理解

@Component和@ComponentScan的联系

@Component 这个注解的作用是把我们写的bean注入到容器中,以供使用。

@ComponentScan 注解的作用则是扫描包中的bean(比如:Spring不知道你定义了某个bean除非它知道从哪里可以找到这个bean,ComponentScan做的事情就是告诉Spring从哪里找到bean),由你来定义哪些包需要被扫描。

一旦你指定了,Spring将会将在被指定的包及其下级包中寻找bean,这两个注解进行配合使用。

@SpringBootApplication和@ComponentScan,扫描包的区别

如果你的其他包都在使用了@SpringBootApplication注解的main app所在的包及其下级包,则你什么都不用做,SpringBoot会自动帮你把其他包都扫描了如果你有一些bean所在的包,不在main app的包及其下级包,那么你需要手动加上@ComponentScan注解并指定那个bean所在的包。

关于@ComponentScan在spring中无效的原因分析以及解决方法就分享到这里了,希望

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/71905.html

(0)

相关推荐

  • 怎样解析html5

    技术怎样解析html5怎样解析html5,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。HTML(Hype Text Markup Language)超文

    攻略 2021年11月23日
  • SQL查询语句怎么写

    技术SQL查询语句怎么写这篇文章主要为大家展示了“SQL查询语句怎么写”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“SQL查询语句怎么写”这篇文章吧。查询所有列Select

    攻略 2021年11月11日
  • 一周的英语,在英语中一周的第一天是星期几

    技术一周的英语,在英语中一周的第一天是星期几在英语中一周的第一天是星期天一周的英语。
    现在世界各国通用一星期七天的制度。这个制度最早由君士坦丁大帝(Constantine the Great)制定。他在公元321年3月7

    生活 2021年10月30日
  • 拍身份证照片要求,拍摄身份证照片有哪些要求

    技术拍身份证照片要求,拍摄身份证照片有哪些要求不能穿着制式服装拍身份证照片要求,尽量穿深色、有领上衣。公民申请办理居民身份证时,相片为彩色正面免冠头像。申领人请勿穿着制式服装,尽量穿深色、有领上衣,但并不局限于黑色、深蓝

    生活 2021年10月24日
  • 户部掌管什么,古代掌管财政的是什么官员

    技术户部掌管什么,古代掌管财政的是什么官员中国古代专门掌管户籍财经的机关称为:户部   户部为六部之一,长官为户部尚书,曾称地官、大司徒、计相、大司农等户部掌管什么。   户部起源于先秦,《周庄》记载此职为“地官大司徒”

    生活 2021年10月25日
  • MySql数据类型的示例分析

    技术MySql数据类型的示例分析这篇文章主要介绍了MySql数据类型的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1.简要概述为什么要开通MyS

    攻略 2021年10月31日