首页 > 编程语言 >Spring5学习随笔-基础注解编程

Spring5学习随笔-基础注解编程

时间:2023-11-22 12:36:29浏览次数:41  
标签:name Spring 编程 Component Value 注解 id Spring5

学习视频:【孙哥说Spring5:从设计模式到基本应用到应用级底层分析,一次深入浅出的Spring全探索。学不会Spring?只因你未遇见孙哥】

注解编程-第一章、注解基础概念

1.什么是注解编程

指的是在类或方法上加入特定的注解(@XXX),完成特定功能的开发.

2.为什么要讲解注解编程

  1. 注解开发方便

    代码简介 开发速度大大提高

  2. Spring开发潮流

    Spring2.x引入注解 Spring3.x完善注解 SpringBoot普及 推广注解编程

3.注解的作用

  • 替换XML这种配置形式,简化配置

    @Component 代替/等效配置中的bean对象

  • 替换接口,实现调用双方的契约性

通过注解的方式,在调用者和功能提供者之间达成约定,进而进行功能的调用,因为注解应用更为方便灵活,所以在现在的开发中,更推荐通过注解的形式完成

4.Spring注解的发展历程

  1. Spring2.x开始支持注解编程 @Component @Service @Scope

    目的:提供这些注解只是为了在某些情况简化XML的配置,作为XML开发的有益补充

  2. Spring3.x @Configuration @Bean

    目的:彻底替换XML,基于纯注解编程

  3. Spring4.x SpringBoot

    提倡使用注解常见开发

5.Spring注解开发的一个问题

Spring基于注解进行配置后,还能否解耦合呢?

在Spring框架应用注解时,如果对注解配置的内容不满意,可以通过Spring配置文件进行覆盖。

第二章、Spring的基础注解(Spring2.x)

这个阶段的注解,仅仅是简化XML的配置,并不能完全代替XML

1.对象创建相关注解

  • 搭建开发环境
<context:component-scan base-package="com.baizhi"/>
作用:让Spring框架在设置的包下扫描对应的注解,使其生效
  • 对象创建相关注解

    • @Component

    作用:替换原有Spring配置文件中的bean标签

    注意:id属性 cmponent注解 提供了默认的设置方式 首单词首字母小写

    class属性 通过反射获得class内容

    @Component 代替/等效配置中的bean对象

    • @Component细节

      如何显示指定工厂创建对象的id值

      @Component("u”) 参数可以设置id值

      • Spring配置文件覆盖注解配置内容

        applicationContext.xml
        <bean id="u" class="com.baizhi.bean.User"/>
        
    • @Component的衍生注解

      @Repository 应用在DAO类型
      @Service    应用在Service类
      @Controller 应用在Controller类
      **注意:本质上这些衍生注解就是@Component 作用、细节、用法都是完全一致
      目的:更加准确的表达一个类型的作用
      注意:Spring整合Mybatis开发过程中 不使用@Repository @Component**
      
  • @Scope注解

    作用:控制简单对象创建次数 等同于scope属性

    注意:不添加@Scope,Spring还是会提供默认值singleton

    <bean id="" class="" scope="singleton|prototype"/>
    
  • @Lazy注解

    作用:延迟创建单实例对象

    注意:一旦使用了@Lazy注解后,Spring会在使用这个对象的时候,才进行对象的创建

    <bean id="" class="" lazy="false"/>
    
  • 生命周期方法相关注解

    1. 初始化相关方法 @PostConstruct

    2. 销毁方法 @PreDestroy

    注意:1.上述的2个注解并不是Spring提供的,是JSR(JavaEE规范)520提供的

    **2.再一次的验证,通过注解实现了接口的契约性**
    

2.注入相关注解

  • 用户自定义类型注入 @Autowired

    @AutoWired细节

    1. Autowired注解基于类型进行注入[推荐]

      基于类型的注入:注入对象的类型,必须与目标成员变量类型相同或者是其子类(实现类)

    2. Autowired加上Qualifier 可以基于名字进行注入[了解即可]

      注入对象id值,必须与Qualifier注解中设置的名字相同

    3. Autowired注解放置位置

      1. 放置在对应成员变量的set方法上
      2. 直接把这个注解放置在成员变量之上,Spring通过反射直接对成员变量进行注入(赋值)[推荐]
    4. JavaEE规范中提供类似功能的注解

      JSR250 @Resouce(name=”userDAOImpl”) 基于名字进行注入

      注意:应用Resource注解时,名字没有配置成功,那么他会继续按照类型进行注入

      JSR330 @Inject 作用 @Autowired完全一致 基于类型进入注入 —→EJB3.0

  • JDK类型

    @Value注解完成

    1. 设置xxx.properties

      id = 10

      name = suns

    2. Spring的工厂读取这个配置文件

      <context:property-placeholder location=””/>

    3. 代码

      属性 @Value("${key}”)

    • @PropertySource
      1. 作用:用于替换Spring配置文件中的<context:property-placeholder location=””/>标签
      2. 开发步骤
        1. 设置xxx.properties

          id=10

          name=suns

        2. 应用@PropertySource

        3. 代码

          属性@Value()

@Component
@PropertySource("classpath:/init.properties")
public class Category {
    @Value("${id}")
    private Integer id;
    @Value("${name}")
    private String name;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
  • @Value注解细节
    • @Value注解不能给静态成员变量赋值
    • @Value注解+Properties这种方式,不能注入集合类型
      • Spring提供新的配置形式 YAML YML(SpringBoot)

3.注解扫描详解

<context:component-scan base-package="com.baizhi"/>
当前包 及其 子包

1.排除方式

<context:component-scan base-package="com.baizhi">
		<context:exclude-filter **type**="" expression=""/>
		**type参数讲解**:assignable:排除特定的类型 不进行扫描
									annotation:排除特定的注解  不进行扫描
									aspectj:切入点表达式 
														包切入点:com.baizhi.bean..*
														类切入点:*.User
									regex:正则表达式来进行排除
									custom:自定义排除策略
</context:component>

排除策略可以叠加使用
<context:component-scan base-package="com.baizhi">
        <context:exclude-filter type="assignable" expression="com.baizhi.bean.User"/>
        <context:exclude-filter type="aspectj" expression="com.baizhi.injection..*"/>
</context:component-scan>

实际开发中常用assignable、annotation、 aspectj(用的最多,切入点表达式)更方便

2.包含方式

和排除方式是相反的,它决定了哪些类的注解被Spring扫描

<context:component-scan base-package="com.baizhi" use-default-filters="false">
      <context:include-filter type="" expression=""/>
</context:component-scan>

1. use-default-filters="false"
	作用:让Spring默认的注解扫描方式 失效
2. <context:include-filter type="" expression=""/>
	作用:指定扫描那些注解
	type:assignable:指定特定的类型 不进行扫描
				annotation:指定特定的注解  不进行扫描
				aspectj:切入点表达式 
									包切入点:com.baizhi.bean..*
									类切入点:*.User
				regex:正则表达式来进行排除
				custom:

包含的方式支持叠加
<context:component-scan base-package="com.baizhi" use-default-filters="false">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Service"/>
    </context:component-scan>

4.对于注解开发的思考

  • 配置互通

    Spring注解配置 配置文件的配置 互通

    @Repository
    public class UserDAOImpl{
    
    }
    
    public class UserServiceImpl{
    		private UserDAO userDAO;
    		set get..
    }
    
    <bean id="userService class="com.baizhi.UserServiceImpl">
    		<property name="userDAO" ref=""/>ref会提示userDAO的选项
    </bean>
    
  • 什么情况下使用注解 什么情况下使用配置文件

    @Component 替换 <bean

    基础注解(@Component @Autowired @Value) 程序员开发类型的配置

    1. 在程序员开发的类型上 可以加入对应注解 进行对象的创建

      User UserService UserDAO UserAction

    2. 应用其他非程序员开发的类型时,还是需要<bean 进行配置的

      SqlSessionFactoryBean MapperScannerConfigure

标签:name,Spring,编程,Component,Value,注解,id,Spring5
From: https://www.cnblogs.com/eyewink/p/17848718.html

相关文章

  • (二十三)C#编程基础复习——Struct结构体
    在C#中,结构体也称为结构类型("structuretype”或“structtype”),它是一种可封装数据和相关功能的值类型,在语法上结构体与类(class)非常相似,它们都可以用来封装数据,并且都可以包含成员属性和成员方法。一、定义结构体要定义一个结构体需要使用struct关键字,每个结构体都可以被看作......
  • 实验2 C语言分支与循环基础应用编程
    实验任务11#include<stdio.h>2#include<stdlib.h>3#include<time.h>45#defineN56#defineN13747#defineN24658intmain(){9intnumber;10inti;11srand(time(0));12for(i=0;i<N;++i){13nu......
  • java注解
    一、java注解用于为java代码提供元数据。提供数据来解释程序代码。注解并非所解释的代码的一部分,不直接影响代码执行。所有注解会自动继承java.lang.annotation这个接口,所以不能再去继承别的接口或类。 解析一个类/方法的注解有2种方式:1、编译期的直接扫描编译器在对jav......
  • shell 编程条件语句
    shelltest  测试0为真test-a/etc/fstabecho$?test-e/etc/fstabecho$? -a,-e#测试文件是否存在-a有bug#取反会有变化test+选项对象参数test-f#只看文件-r#是否有读的权限-w#是否有写的权限-x#是否有执行的权限-d#目录-f#文件[-e/etc/fs......
  • 工程中的“面向对象”编程
    工程中的“面向对象”编程在工程处理中,工程师很容易写出碎片的脚本代码,例如处理服务器上的脚本:假设了一些存在的环境变量、目录结构、配置和数据脚本基于这些假设开始做一堆中间处理,并最终得到一些输出数据。即使有了docker,有了k8s,无论是在docker外,还是docker内,还是会有很多......
  • 计算机科学与技术之网络编程 Windows下VC6.0 网络SOCKET编程C语言实现(服务端)
    在VC6.0平台用C语言实现网络SOCKET通信一.在VC6.0平台创建Win32ConsoleApplication工程工程名称自拟(或输入firstSocket)添加新建项文件C++SourceFile 文件名自拟,后缀.c(如firstSocket.c)在firstSocket.c加入头文件#include<winsock2.h>链接动态库#pragmacomment(l......
  • MyBatisPlus 注解方式实现多表关联查询
    Mapper写法:@Select("SELECT*FROMtableAaLEFTJOINtableBbona.key=b.key${ew.customSqlSegment}")Listmethod1(@Param(Constants.WRAPPER)QueryWrapperwrapper);IPagemethod2(Page<>page,@Param(Constants.WRAPPER)QueryWrapperwrapper......
  • 编程之旅,扬帆起航
    嗨,亲爱的读者!我是顾平安,感谢您点开我的这篇博客。作为一个对技术充满热情的新手,我会在博客园分享我的学习之旅,希望能与你们一起成长。自我介绍我是某机构的前Python讲师,从大学起对计算机科学和编程充满了浓厚的兴趣。我的编程旅程始于2020年,当时我被爬虫技术深深吸引。从那......
  • 零代码编程:用ChatGPT根据视频标题来批量重命名字幕文件
    现在有很多视频文件:还有视频相对应的字幕文件:F:\儿童学习教育\Abadas.适合2岁以上.BBC儿童学习单词的动画\abadas字幕两者的文件标题不一样,现在要将字幕文件的标题全部根据视频文件来重命名。在chatGPT中输入提示词:你是一个Python编程专家,要完成一个根据视频标题来批量重命名字幕文......
  • Spring_202311_21_2 2. AOP面向切面编程
    Spring_202311_21_22. AOP面向切面编程AOP:全称是AspectOrientedProgramming即:面向切面编程。简单的说它就是把我们程序重复的代码抽取出来,在需要执行的时候,使用动态代理的技术,在不修改源码的基础上,对我们的已有方法进行增强。即当需要扩展功能时,传统方式采用纵向继承方式......