<context:component-scan base-package=""/>注解的原理

1.定义Student类

package cn;

import org.springframework.stereotype.Component;

/**
 * Student类
 * @author Administrator
 *
 */
@Component
public class Student {
    /**
     * 定义学生说话的方法
     */
    public void say(){
        System.out.println("学生说话");
    }

}

2.定义Person类

package cn;
/**
 * Student类
 * 
 */
import javax.annotation.Resource;

import org.springframework.stereotype.Component;
@Component
public class Person {
    /**
     * @Resource是依赖注解
     *
     */
    @Resource
    private Student student;
    
    public void say(){
        this.student.say();
    }
}

3.定义配置文件

<?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"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
                        http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
                        http://www.springframework.org/schema/context
                        http://www.springframework.org/schema/context/spring-context-3.1.xsd">
    <!-- 
        1.导入context命名空间
        xmlns:context="http://www.springframework.org/schema/context"
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.1.xsd"
     -->
    <!-- 2.注解配置解析器 用于依赖注入 -->
    <context:annotation-config/>
    <!-- 3.在所需要注解的地方配置@Resource -->
    <!-- 
        对bean用Annotation配置  [component就是bean]
        1.启动组件扫描的注解解析器
        <context:component-scan base-package="cn"/>
        base-package
            会在base-package="cn"会在cn包及子包下进行扫描
        2.在所需要的类上加入@Component
            相当于<bean id="student" class="cn.Student"/>
                <bean id="student" class="cn.Person"/>
     -->
    <context:component-scan base-package="cn"/>

</beans>

4.定义测试类

package cn;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
 * <context:annotation-config/>的原理
 *  1.启动Spring容器,并且加载配置文件
 *  2.创建对象
 *  3.当解析到<context:annotation-config/>的时候,会启动依赖注入的解析器
 *  4.会在纳入Spring管理的bean的范围内,看那些bean的属性上有@Resource注解
 *  5.如果@Resource注解的值为"",那么会把注解所在的属性的名称和Spring容器中bean的id进行匹配,
 *       如果匹配成功,则把id对应的对象赋值给该属性,如果匹配不成功,则按照类型进行匹配。
 *  6.如果@Resource注解的值不为"",那么会把name属性的值和Spring容器中的bean的id匹配,如果匹配成功,则赋值;如果匹配不成功,则报错    
 * @author Administrator
 * <context:component-scan base-package="cn"/>的原理
 * 1.启动Spring容器,加载配置文件
 * 2.Spring容器加载<context:component-scan base-package="cn"/>,看类上是否有@Component注解
 * 如果@Component注解上没有写任何属性
 * 示例:      
 *     @Component
 *     public class Person(){}
 *     
 *     上面的注解配置就相当于<bean id="person" class="cn.Person">    
 * 如果@Component有属性
 * 示例:      
 *     @Component("person1")
 *     public class Person(){}
 *  上面的注解配置就相当于<bean id="person1" class="cn.Person">    
 * 3.在纳入Spring管理的bean的范围内查找@Resource注解,执行@Resource注解过程  
 */
public class Test {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        Person person = context.getBean("person",Person.class);
        person.say();
    }

}

显示结果

log4j:WARN No appenders could be found for logger (org.springframework.core.env.StandardEnvironment).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
学生说话

实现原理:

* <context:component-scan base-package="cn"/>的原理
 * 1.启动Spring容器,加载配置文件
 * 2.Spring容器加载<context:component-scan base-package="cn"/>,看类上是否有@Component注解
 * 如果@Component注解上没有写任何属性
 * 示例:      
 *     @Component
 *     public class Person(){}
 *     
 *     上面的注解配置就相当于<bean id="person" class="cn.Person">    
 * 如果@Component有属性
 * 示例:      
 *     @Component("person1")
 *     public class Person(){}
 *  上面的注解配置就相当于<bean id="person1" class="cn.Person">    
 * 3.在纳入Spring管理的bean的范围内查找@Resource注解,执行@Resource注解过程

* <context:annotation-config/>的原理
 *  1.启动Spring容器,并且加载配置文件
 *  2.创建对象
 *  3.当解析到<context:annotation-config/>的时候,会启动依赖注入的解析器
 *  4.会在纳入Spring管理的bean的范围内,看那些bean的属性上有@Resource注解
 *  5.如果@Resource注解的值为"",那么会把注解所在的属性的名称和Spring容器中bean的id进行匹配,如果匹配成功,则把id对应的对象赋值给该属性,如果匹配不成功,则按照类型进行匹配。
 *  6.如果@Resource注解的值不为"",那么会把name属性的值和Spring容器中的bean的id匹配,如果匹配成功,则赋值;如果匹配不成功,则报错

时间: 2024-08-25 16:48:22

<context:component-scan base-package=""/>注解的原理的相关文章

深入探索spring技术内幕(四): 剖析@Resource注解实现原理与注解注入

一.@Resource注解原理 @Resource可以标注在字段或属性的setter方法上 1.  如果指定了name属性, 那么就按name属性的名称装配; 2. 如果没有指定name属性, 那就按照默认的名称查找依赖对象; 3. 如果按默认名称查找不到依赖对象, 那么@Resource注解就会回退到按类型装配; ① 先写一个自己的@MyResource: import java.lang.annotation.Retention; import java.lang.annotation.Re

Spring-扫描注解原理,注解自动扫描原理分析

注解自动扫描原理分析 在spring的配置文件中加入如下代码,spring便开启了自动扫描,那么它的底层到底是如何实现的呢? <context:component-scan base-package="com.wisely.highlight_spring4.ch1"/> 首先找到解析这个标签的地方,spring 中解析具体的标签都有相应的解析器,且都继承了NamespaceHandlerSupport 查看 ComponentScanBeanDefinitionParse

async异步注解和aspect切面注解等注解的原理

在我们使用spring框架的过程中,在很多时候我们会使用@async注解来异步执行某一些方法,提高系统的执行效率.今天我们来探讨下spring是如何完成这个功能的. 1.spring 在扫描bean的时候会扫描方法上是否包含@async的注解,如果包含的,spring会为这个bean动态的生成一个子类,我们称之为代理类(?). 2.代理类是继承我们所写的bean的,然后把代理类注入进来,在执行此方法时会到代理类中,代理类判断此方法需要异步执行,就不会调用父类 (我们原本写的bean)的对应方法.

Spring 注解配置原理

声明 源码基于Spring 5.0.8 1. 简介 自从Spring Boot流行,基于注解的配置逐渐取代了XML配置.因为突然而来的兴趣从而阅读了Spring 对Configuration注解的解析流程. 2. 原理介绍 解析@Configuration的入口是ConfigurationClassPostProcessor.ConfigurationClassPostProcessor实现了BeanDefinitionRegistryPostProcessor接口,使得Spring在初始过程中

Java注解及其原理以及分析spring注解解析源码

注解的定义 注解是那些插入到源代码中,使用其他工具可以对其进行处理的标签. 注解不会改变程序的编译方式:Java编译器对于包含注解和不包含注解的代码会生成相同的虚拟机指令. 在Java中,注解是被当做一个修饰符来使用的(修饰符:如public.private) 注解的常用用法:1. 附属文件的自动生成,例如bean信息类. 2. 测试.日志.事务等代码的自动生成. 单元测试例子: import org.junit.Test; public class SomeTest { @Test publi

java基础-注解Annotation原理和用法

在很多java代码中都可以看到诸如@Override.@Deprecated.@SuppressWarnings这样的字符,这些就是注解Annotation.注解最早在jdk5中被引入,现在已经成为java平台很重要的一部分了,很多的框架程序中也喜欢使用注解,如Spring.Mybatis等. 那么,什么是注解呢?注解就是元数据,一种描述数据的数据,通俗一点就是为程序的元素(类.方法.成员变量)加上更直观的说明,这些说明信息是与程序的业务逻辑无关的.但是,我们可以通过java的反射机制来获取An

SpringMvc框架MockMvc单元测试注解及其原理分析

来源:https://www.yoodb.com/ 首先简单介绍一下Spring,它是一个轻量级开源框架,简单的来说,Spring是一个分层的JavaSE/EEfull-stack(一站式) 轻量级开源框架.特点方便解耦,简化开发,AOP编程的支持声明式,事务的支持以及降低Java EE API的使用难度等. 目前主流的Web MVC框架除了Struts之外就是SpringMVC,不过要想灵活运用SpringMVC来应对大多说的web开发除了必须掌握其配置和原理外还需要会测试.在Spring3.

Spring Boot常用注解和原理整理

一.启动注解 @SpringBootApplication @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExc

spring中@Async注解的原理和使用

分析过程: 开启异步代理 初始化excutor和exceptionHandler 定义切面处理 线程处理 @EnableAsync @EnableAsync是开启某个模块的功能加载,之前在<导图梳理springboot手动.自动装配,让springboot不再难懂>介绍过,@EnableXXX一般都有两种用法,一种直接引入配置,一种可以通过注解的元数据选择需要导入的配置.这里的@EnableAsync明显属于第二种. 这个EnableAsync注解,一般注解属性我们都不需要改,默认就行了.那么