Spring最常用组件注册注解开发案例

Spring常用组件注册注解开发案例

文章目录

  • Spring常用组件注册注解开发案例
  • 1. 组件注册注解
    • 1. @Configuration
    • 2.@Bean注解
    • 3. @Configuration与@Bean注解使用案例
    • 4. ComponentScan注解
    • 5. 自定义TypeFilter指定过滤规则

什么是spring注解开发?

就是不再使用Spring的bean.xml文件,纯使用注解的方式开发;

要使用纯注解开发,就需要有一个配置类,配置类==配置文件

spring版本:

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

1. 组件注册注解

1. @Configuration

@Configuration:一旦在某个类上标注了此注解,说明此类就是一个配置类

注解的定义如下:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
package org.springframework.context.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.core.annotation.AliasFor;
import org.springframework.stereotype.Component;@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {@AliasFor(annotation = Component.class)String value() default "";
}

2.@Bean注解

@Bean:给容器中注册一个bean;类型为返回值的类型,id默认使用方法名作为id

注解的定义如下:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//package org.springframework.context.annotation;import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.beans.factory.annotation.Autowire;
import org.springframework.core.annotation.AliasFor;@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Bean {@AliasFor("name")String[] value() default {};@AliasFor("value")String[] name() default {};/** @deprecated */@DeprecatedAutowire autowire() default Autowire.NO;boolean autowireCandidate() default true;String initMethod() default "";String destroyMethod() default "(inferred)";
}

3. @Configuration与@Bean注解使用案例

定义一个名为Person的类,如下

package com.yuan.bean;public class Person {private String name;private Integer age;public Person() {}public Person(String name, Integer age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';}
}
  • 传统的方式实现注册一个bean的方式:

    1.编写spring的核心配置文件,如bean.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:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd "><!--包扫描xml配置:只要标注了@Controller、@Service、@Repository、@Component等注解,它们会自动的加载到IOC容器中--><!--<context:component-scan base-package="com.yuan"></context:component-scan>--><!--使用set方式赋值--><bean id="person" class="com.yuan.bean.Person"><property name="age" value="22" /><property name="name" value="jinshengyuan"/></bean>
    </beans>
    
    1. 加载spring核心配置文件 bean.xml文件来初始化一个Person类
    package com.yuan;import com.yuan.bean.Person;
    import com.yuan.config.MainConfig;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.annotation.AnnotationConfigApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;public class MainTest {public static void main(String[] args) {//xml配置的方式ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml");Person person = (Person) applicationContext.getBean("person");System.out.println(person);}}
    }
    执行结果:Person{name='jinshengyuan', age=22}
    
  • 使用注解驱动开发方式注册一个bean

    1. 编写一个配置类,如下面的MainConfig.java
    package com.yuan.config;import com.yuan.bean.Person;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    //配置类 == 配置文件
    @Configuration //告诉spring这是一个配置类
    public class MainConfig {/*** @Bean注解: 给容器中注册一个bean;类型为返回值的类型,id默认使用方法名作为id* 如果要自己指定id,则需要加上name属性,如:@bean(value="person"),value可省略写成@Bean("person")* @return*/@Bean(name = "person")public Person person01(){return new Person("张三",20);}
    }
    
    1. 初始化bean
    package com.yuan;import com.yuan.bean.Person;
    import com.yuan.config.MainConfig;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.annotation.AnnotationConfigApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;public class MainTest {public static void main(String[] args) {//xml配置的方式/*ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml");Person person = (Person) applicationContext.getBean("person");System.out.println(person);*///使用注解的方式为IOC容器注册一个组件ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);Person person = applicationContext.getBean(Person.class);System.out.println(person);//根据类型获取bean的名称String[] beanNamesForType = applicationContext.getBeanNamesForType(Person.class);for (int i=0;i<beanNamesForType.length;i++){System.out.println(beanNamesForType[i]);}}
    }
    

4. ComponentScan注解

@ComponentScan:只要标注了@Controller、@Service、@Repository、@Component等注解,它们会通过@ComponentScan自动的加载到IOC容器中

@ComponentScan属性:

  • value:指定自动扫描的包
  • excludeFilters = ComponentScan.Filter[] : 指定扫描的时候按照什么规则排除哪些组件;
  • includeFilters = ComponentScan.Filter[] : 指定扫描的时,只需要包含哪些组件,还需配合与禁用默认规则一起使用;
  • useDefaultFilters = false : 禁用自动扫描的默认规则

@ComponentScan.Filter的属性:

@ComponentScan.Filter的属性type过滤规则FilterType.ANNOTATION:按照注解(常用)FilterType.ASSIGNABLE_TYPE :按照给定的类型(常用)FilterType.ASPECTJ:使用ASPECTJ表达式FilterType.CUSTOM :使用自定义规则FilterType.REGEX :使用正则表达式指定
  1. xml配置方法:
<context:component-scan base-package="com.yuan"></context:component-scan>
  1. 注解方式:Java8+
package com.yuan.config;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Service;@Configuration
@ComponentScan(value = "com.yuan",excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION,classes = {Controller.class})
},includeFilters = {@ComponentScan.Filter(type =FilterType.ANNOTATION,classes = {Service.class})@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE,classes ={BookServices.class}
},useDefaultFilters = false) //自动扫描的包//excludeFilters = ComponentScan.Filter[] : 指定扫描的时候按照什么规则排除哪些组件
//includeFilters = ComponentScan.Filter[] : 指定扫描的时,只需要包含哪些组件,还需配合禁用掉默认规则一起使用
//useDefaultFilters = false : 禁用自动扫描的的默认规则
//如果是Java8版本,则可以多次使用@ComponentScan注解,如果Java8之前的版本,则使用@ComponentScans注解来多次使用@ComponentScan注解
@ComponentScan(...) //java8中可以写多个@ComponentScan
@ComponentScan(...) //java8中可以写多个@ComponentScan
public class MyConfigOne {@Bean("person")public Person person(){return new Person("李四",25);}
}
  1. 注解方式:Java8以下版本要配置多个@ComponentScan时使用@ComponentScans注解来做
package com.yuan.config;import com.yuan.bean.Person;
import org.springframework.context.annotation.*;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Service;@Configuration
@ComponentScans(value = {@ComponentScan(value = "com.yuan", excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, classes = {Controller.class})}, includeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, classes = {Service.class})}, useDefaultFilters = false) //自动扫描的包}
)
//excludeFilters = ComponentScan.Filter[] : 指定扫描的时候按照什么规则排除哪些组件
//includeFilters = ComponentScan.Filter[] : 指定扫描的时,只需要包含哪些组件,还需配合禁用掉默认规则一起使用
//useDefaultFilters = false : 禁用自动扫描的的默认规则
//如果是Java8版本,则可以多次使用@ComponentScan注解,如果Java8之前的版本,则使用@ComponentScans注解来多次使用@ComponentScan注解
public class MyConfigOne {@Bean("person")public Person person(){return new Person("李四",25);}
}

5. 自定义TypeFilter指定过滤规则

  1. 编写自定义规则类
package com.yuan.config;import org.springframework.context.annotation.FilterType;
import org.springframework.core.io.Resource;
import org.springframework.core.type.AnnotationMetadata;
import org.springframework.core.type.ClassMetadata;
import org.springframework.core.type.classreading.MetadataReader;
import org.springframework.core.type.classreading.MetadataReaderFactory;
import org.springframework.core.type.filter.TypeFilter;import java.io.IOException;/*** @ComponentScan.Filter 的type属性自定义规则类(type = FilterType.CUSTOM),实现了TypeFilter接口*/
public class MyTypeFilter implements TypeFilter {/**** @param metadataReader the metadata reader for the target class (读取到的正在扫描的类的信息)* @param metadataReaderFactory  a factory for obtaining metadata readers (是一个工厂,可以获取其他任何类的信息)* 	* for other classes (such as superclasses and interfaces)* @return* @throws IOException*/@Overridepublic boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {//获取当前类注解信息AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();//获取当前正在扫描的类的信息,比它的类型式什么,实现了哪些接口等等ClassMetadata classMetadata = metadataReader.getClassMetadata();//获取当前类的类名String className = classMetadata.getClassName();System.out.println("---className---->>>>"+className);//获取当前类的资源信息(如类的路径)Resource resource = metadataReader.getResource();//如果类名中包含er则匹配成功if(className.contains("er")){return true;}return false;}
}
  1. 自定义规则配置类
package com.yuan.config;import com.yuan.bean.Person;
import org.springframework.context.annotation.*;@Configuration
//如果Java8之前的版本,则使用@ComponentScans注解来多次使用@ComponentScan注解
@ComponentScans(value = {@ComponentScan(value = "com.yuan", includeFilters = {@ComponentScan.Filter(type = FilterType.CUSTOM, classes = {MyTypeFilter.class})}, useDefaultFilters = false) //自动扫描的包}
)
/*@ComponentScan.Filter过滤规则FilterType.ANNOTATION:按照注解(常用)FilterType.ASSIGNABLE_TYPE :按照给定的类型(常用)FilterType.ASPECTJ:使用ASPECTJ表达式FilterType.CUSTOM :使用自定义规则FilterType.REGEX :使用正则表达式指定*/
public class MyConfigTwo {@Bean(value = "person")public Person person() {return new Person("张三", 33);}
}
  1. 测试
package com.yuan.test;import com.yuan.config.MainConfig;
import com.yuan.config.MyConfigTwo;
import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class IOCTest {@Testpublic void testTwo(){AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MyConfigTwo.class);String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();for (String beanDefinitionName : beanDefinitionNames) {System.out.println(beanDefinitionName);}}
}
  1. 执行结果:
---className---->>>>com.yuan.test.IOCTest
---className---->>>>com.yuan.MainTest
---className---->>>>com.yuan.bean.Person
---className---->>>>com.yuan.config.MainConfig
---className---->>>>com.yuan.config.MyConfigOne
---className---->>>>com.yuan.config.MyTypeFilter
---className---->>>>com.yuan.controller.BookController
---className---->>>>com.yuan.dao.BookDao
---className---->>>>com.yuan.services.BookServices
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactorymyConfigTwo   ----配置类自己
person        ----@Bean加载的person类,由容器创建的,所有会看到
下面这三个就是由MyTypeFilter过滤规则进行过滤的类
myTypeFilter
bookController
bookServices

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/638869.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PHP+vue+Mysql家庭理财管理系统演5x6nf

本文着重阐述了收支管理系统的分析、设计与实现&#xff0c;首先介绍开发系统和环境配置、数据库的设计&#xff0c;对系统的功能需求作出分析&#xff0c;根据需求对系统进行设计&#xff0c;明确各个部分的规范&#xff0c;来完成系统的设计。最后在对设计的系统进行一系列的…

k8s1.27.2版本二进制高可用集群部署

文章目录 环境软件版本服务器系统初始化设置关于etcd签名证书etcd集群部署负载均衡器组件安装设置关于k8s自签证书自签CAkube-apiserver 自签证书kube-controller-manager自签证书kube-scheduler自签证书kube-proxy 自签证书admin 自签证书 控制平面节点组件部署**部署kube-api…

前端开发领域的细分领域与特点

前端开发领域是一个广泛而多样的领域&#xff0c;包括了许多具体的细分领域。本文将介绍前端领域的细分领域&#xff0c;包括Web前端、移动端、桌面端、游戏端和VR/AR前端等&#xff0c;并分析它们各自的特点&#xff0c;以帮助读者更好地了解前端开发的多样性。 一、引言 前…

【python学习】面向对象编程3

面向对象基础 面向对象编程 面向过程编程&#xff1a;类似于工厂的流水线。 优点&#xff1a;逻辑清晰&#xff1b; 缺点&#xff1a;扩展性差。 面向对象编程&#xff1a;核心是对象二字&#xff0c;对象是属性和方法的集合体&#xff0c;面向对象编程就是一堆对象交互。 优…

Spring 事务原理一

从本篇博客开始&#xff0c;我们将梳理Spring事务相关的知识点。在开始前&#xff0c;想先给自己定一个目标&#xff1a;通过此次梳理要完全理解事务的基本概念及Spring实现事务的基本原理。为实现这个目标我想按以下几个步骤进行&#xff1a; 讲解事务中的一些基本概念使用Sp…

x-cmd pkg | jq - 命令行 JSON 处理器

目录 简介首次用户功能特点类似工具进一步探索 简介 jq 是轻量级的 JSON 处理工具&#xff0c;由 Stephen Dolan 于 2012 年使用 C 语言开发。 它的功能极为强大&#xff0c;语法简洁&#xff0c;可以灵活高效地完成从 JSON 数据中提取特定字段、过滤和排序数据、执行复杂的转…

Java NIO (三)NIO Channel类

1 概述 前面提到&#xff0c;Java NIO中一个socket连接使用一个Channel来表示。从更广泛的层面来说&#xff0c;一个通道可以表示一个底层的文件描述符&#xff0c;例如硬件设备、文件、网络连接等。然而&#xff0c;远不止如此&#xff0c;Java NIO的通道可以更加细化。例如&a…

在react中说说对受控组件和非受控组件的理解?以及应用场景

在react中说说对受控组件和非受控组件的理解&#xff1f;以及应用场景 回答思路&#xff1a;说说受控组件-->说说非受控组件-->应用场景受控组件&#xff1a;非受控组件应用场景 回答思路&#xff1a;说说受控组件–>说说非受控组件–>应用场景 受控组件&#xff…

【GitHub项目推荐--GitHub 上的考研神器】【转载】

如果有打算考研的读者&#xff0c;这些开源项目不能错过。把各个学校近几年考研初试真题分享给大家&#xff08;包括 408&#xff09;&#xff0c;应该能帮上大家&#xff0c;文末有下载方式。 同时&#xff0c;我把盘点的开源相关的学习项目更新到 Awesome GiHub Repo&#xf…

YOLOv8改进 | Conv篇 | 2024.1月最新成果可变形卷积DCNv4(全网独家首发,附详细教程)

一、本文介绍 本文给大家带来的改进机制是2024-1月的最新成果DCNv4,其是DCNv3的升级版本,效果可以说是在目前的卷积中名列前茅了,同时该卷积具有轻量化的效果!一个DCNv4参数量下降越15Wparameters左右,。它主要通过两个方面对前一版本DCNv3进行改进:首先,它移除了空间聚…

在 Windows 操作系统上安装和配置 Flutter 开发环境

在 Windows 操作系统上安装和配置 Flutter 开发环境 系统配置要求 为了成功安装和运行 Flutter&#xff0c;确保您的开发环境满足以下基本需求&#xff1a; 操作系统&#xff1a;Windows 7 SP1 或更高版本。处理器&#xff1a;支持 64 位的架构。磁盘空间&#xff1a;至少预留…

【GitHub项目推荐--智能家居项目】【转载】

如果你具备硬件、软件知识&#xff0c;这个项目肯定符合你的胃口。 物美智能是一套软硬件结合的开源项目&#xff0c;该系统可助你快速搭建自己的智能家居系统。你可以学习到设备的集成和软硬件交互。 PC 端或者手机与服务端通信&#xff0c;单片机可以接受遥控设备和服务器的…

什么是DNS隐蔽信道?如何防御?

DNS隐蔽信道是一种利用域名系统(Domain Name System,DNS)进行数据传输的技术,它可以在不引起用户和网络安全系统注意的情况下,通过DNS查询和响应传输信息。由于DNS协议的设计初衷是为了解析域名到IP地址的映射,它通常不被视为用于传输大量数据的协议。然而,攻击者可以滥…

硬件-11-服务器的基础知识

参考服务器基础知识大科普 1 电视剧背景 服务器被誉为互联网之魂。 电视剧《创业年代》是一部有冯绍峰和袁姗姗等人联手主演的一部讲述我国第一批科技创业者创业故事的电视剧&#xff0c;可以说是他们铲下了建设中关村的第一捧土。 电视剧《创业年代》中的潮信公司并没有…

【神经网络】火箭点火发射-诠释一场数据与学习的奇妙之旅

火箭点火发射来理解神经网络的故事细节 在一个充满科技气息的研究室里&#xff0c;一群科学家们正在忙碌地准备着一次重要的火箭点火发射。这次发射不仅是一次航天探索的壮丽征程&#xff0c;更是一场利用神经网络处理数据的智慧之旅。 在火箭发射的背后&#xff0c;神经网络…

中仕教育:研究生毕业可以考选调生吗?

选调生的报考条件之一是应届生&#xff0c;研究生毕业也属于应届生&#xff0c;所以是可以报考的。 选调生不同学历的年龄限制&#xff1a; 1.应届本科生&#xff1a;年龄在25岁以内 2.应届研究生&#xff1a;年龄在30岁以内 3.应届博士生&#xff1a;年龄在35岁以内 研究…

for...in、for...of、for...Each的详细区别!

for...in for...in 语句以任意顺序迭代一个对象的除Symbol以外的可枚举属性&#xff0c;包括继承的可枚举属性。 仅迭代自身的属性 如果你只要考虑对象本身的属性&#xff0c;而不是它的原型&#xff0c;那么使用 getOwnPropertyNames() 或执行 hasOwnProperty() 来确定某属…

excel统计分析——Tukey法多重比较

参考资料&#xff1a;生物统计学 https://real-statistics.com/one-way-analysis-of-variance-anova/unplanned-comparisons/tukey-hsd/ Tukey法是基于学生化极差分布计算最小显著极差&#xff08;LSR&#xff09;&#xff0c;根据平均数个数调整最小显著极差。 LSR&#xff1…

Steam++(Watt Toolkit)加速GitHub失效特殊情况

github无法访问有很多情况&#xff0c;网上已经有很多解决方法&#xff0c;这里说一种特殊情况 如果你满足下列条件&#xff1a; 1、使用过Steam&#xff08;Watt Toolkit&#xff09;加速GitHub&#xff1b; 2、某天突然发现Steam&#xff08;Watt Toolkit&#xff09;对GitH…

LINUX常用工具之sudo权限控制

一、Sudo基本介绍 sudo是Linux 中用于允许特定用户以超级用户或其他特权用户的身份执行特定的命令或任务。sudo 提供了一种安全的方法&#xff0c;使用户能够临时获取额外的权限&#xff0c;而不需要以完全超级用户的身份登录系统。sudo也可以用了设置黑名单命令清单&#xff…