Spring学习记录【一】

https://blog.csdn.net/weixin_39981912/article/details/79851315#commentBox

目录

  • 什么是Spring
  • 开发步骤
  • Bean
    • Bean的配置项
    • Bean的作用域(scope)
  • Spring注入
    • 属性注入
    • 注入对象类型属性
  • Spring的bean管理(重)
  • Aware接口
  • 注解对象
    • 自动装配
    • Resources
  • Bean 的定义及作用域注解
    • 元注解
    • 类的自动监测及 Bean 的注册
    • 使用过滤器进行自定义扫描
  • @Autowired注解说明1(与@Required)
  • @Autowired注解说明2
  • @Autowired注解说明3(@Qualifier)
  • @Bean
  • @ImportResource和@Value
  • Spring对JSR的支持
  • Spring AOP
  • 在服务器启动时候加载Spring配置文件
  • 基于aspectj的注解AOP操作



什么是Spring

Spring是一个开源框架,是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。

(IOC)反转控制是Spring的基础, 简单说就是创建对象由以前的程序员自己new构造方法来调用,变成了交由Spring创建对象

两种实现: 依赖查找(DL)和依赖注入(DI)
注:DL已被抛弃,因为他需要用户自己去是使用 API 进行查找资源和组装对象。Spring学习记录【一】_第1张图片

在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面(AOP)的编程。

所谓依赖注入,就是由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中。


开发步骤

1)下载Spring的开发包.

2)创建web项目,引入Spring的开发包
Spring学习记录【一】_第2张图片
3)引入相关配置文件

创建Spring配置文件,配置创建类
(1)Spring的核心配置文件名称和位置不是固定的,建议放到src下面, 官方建议名称 是applicationContex.xml,但是名称可以随意写
(2)在配置文件中引入schema约束

在这里插入图片描述

4)编写相关的类
Spring学习记录【一】_第3张图片

5)完成配置配置对象创建(这里xml(就是配置文件方式)配置)
Spring学习记录【一】_第4张图片

6)编写测试程序
Spring学习记录【一】_第5张图片




Bean

Bean的配置项

  • Id【常用】
  • name【name可以有多个,id只能有一个,id取名严格一些】
  • Class【常用:创建对象所在类的全路径】
  • Scope【常用】
  • Constructor arguments
  • Properties
  • Autowiring mode
  • lazy-initialization mode
  • Initialization/destruction method

Bean的作用域(scope)

  • singleton:单例,指一个bean容器只存在一份
  • prototype:每次请求(每次使用)创建新的实例,destroy方式不生效
  • request:每次http请求创建一个实例且仅在当前request内有效
  • session:同上,每次http请求创建,当前session内有效
  • global session:基于portlet的web中有效(portlet定义了global session),如果在web中,同session

作用域限定了Spring Bean的作用范围,在Spring配置文件定义Bean时,通过声明scope配置项,可以灵活定义Bean的作用范围。

singleton是默认的作用域,当定义Bean时,如果没有指定scope配置项,Bean的作用域被默认为singleton。singleton属于单例模式,在整个系统上下文环境中,仅有一个Bean实例。也就是说,在整个系统上下文环境中,你通过Spring IOC获取的都是同一个实例。



Spring注入

Spring注入是指在启动Spring容器加载bean配置的时候,完成对变量的赋值行为。

参考博客:https://blog.csdn.net/qq594913801/article/details/80512451

                 属性注入的方式介绍(三种方式)

                (1):使用set方法注入【重点】
                (2):使用有参数的构造方法注入【】
                (3):使用接口注入



属性注入

1.使用有参数构造注入属性
Spring学习记录【一】_第6张图片
Spring学习记录【一】_第7张图片
2:使用set方法注入属性(重点
Spring学习记录【一】_第8张图片
Spring学习记录【一】_第9张图片

注入对象类型属性

Spring学习记录【一】_第10张图片
Spring学习记录【一】_第11张图片

8:注解注入属性:需求:在service中得到dao对象
(1)创建dao和service对象
Spring学习记录【一】_第12张图片




2)在service类里面定义dao’类型的属性

2.1 注入对象属性第一个 注解 @Autowired
Spring学习记录【一】_第13张图片

2.注入对象属性第二个 注解 @Resource(常用,因为这个可以注明对象名)
Spring学习记录【一】_第14张图片




Spring学习记录【一】_第15张图片

@Autowired:自动装配 基于@Autowired的自动装配,默认是根据类型注入,可以用于构造器、接口、方法注入

 public class Test1 {  
    private MessageInterface message;  
    @Autowired //构造器注入  
    private Test1(MessageInterface message) {  
        this.message = message;  
        //省略getter和setter  
    } 
  }  


 public class Test3 {  
    private MessageInterface message;  
 
    @Autowired //setter方法注入  
    public void setMessage(MessageInterface message) {  
        this.message = message;  
    }  
    public String getMessage() {  
        return message;  
    }  
}


Spring的bean管理(重)

1:注解开发准备,导包
2:创建类,创建方法
3:创建Spring配置文件,引入约束(注解约束…)
4:注解开发就得,开启注解扫描

Spring学习记录【一】_第16张图片

5:注解创建对象
Spring学习记录【一】_第17张图片

.6:创建对象有四个注解(目前这几个的功能都一样,都是创建对象)
@Component
@Controller
@Service
@Repository

7:创建对象是单实例还是多实例
Spring学习记录【一】_第18张图片
在这里插入图片描述




Spring学习记录【一】_第19张图片

Aware接口

实现了Aware系列接口的bean可以访问Spring容器
参考博客:https://cloud.tencent.com/developer/article/1409274

Spring学习记录【一】_第20张图片

注解对象

自动装配

参考博客:https://www.jianshu.com/p/32c3f895a3b5
Spring学习记录【一】_第21张图片
Spring学习记录【一】_第22张图片
spring的自动注入set方法注入构造器注入,都需要在ioc容器中显示的声明property或contructor.
不显示的声明,可以用bean的自动装配在beans中配置default-autowire="byName/byType/No/Constructor"等。使得bean的ioc容器显得更加简洁。

Resources

Spring学习记录【一】_第23张图片

四种applicationContext.getResource

Resource resource = applicationContext.getResource("config.txt");

Resource resource = applicationContext.getResource("file:D:\\gitee\\immoc\\JUnit\\Spring\\src\\config.txt");

Resource resource = applicationContext.getResource("classpath:config.txt");

Resource resource = applicationContext.getResource("url:http://mini.eastday.com/a/180508073058295.html?qid=01601");


Bean 的定义及作用域注解

@Controller :注解控制器类(控制层 MVC)
@Service :注解服务类(服务层)
@Repository :注解 DAO 类(持久层)
@Component :将普通的 bean 注解到 spring 容器中,相当于配置文件中的

元注解

元注解即是许多 Spring 提供的注解可以作为自己的代码,元注解是一个简单的注解,可以应用到另一个注解(注解的注解)
除了 value() 元注解还可以有其他的属性,允许定制

类的自动监测及 Bean 的注册

Spring 可以自动检测类并注册 Bean 到 Applicationcontext 中
component-scan 扫描在base-package包内中带有@Component,@Service,@Controller等注解的bean,并注册到spring容器中。

@Component默认将类名首字母小写作为bean名
@Component(“bean”)自定义bean名为bean
@Scope 表示bean的作用域


使用过滤器进行自定义扫描

默认情况下,类被自动发现并注册 bean 的条件:使用 @Component @Repository @Service @controller 注解或者使用 @Component 的自定义注解;
可以通过过滤器修改默认注解的行为,还可以使用 use-default-filters = "false" 禁用自动发现与注册



@Autowired注解说明1(与@Required)

学习博客:https://www.cnblogs.com/fnlingnzb-learner/p/9723834.html
https://www.baidu.com/link?url=57aywD0Q6WTnl7XKbIHuE7R_FT8mrDBMv8kdi_tomrzOs6R7FCtwiOakLdJFq644XWwbt8KS1P6B2l8lhWpTNu_-vaeOE7IOeVAvEfJDdXi&wd=&eqid=9073f0df00095bb2000000065d7f2dc5
https://blog.51cto.com/wuwen2011/1542692

@Required:适用于Bean属性的set方法上,bean属性必须在配置时被填充,通过bean定义或自动装配一个明确的属性值。(不常用)

@Autowired:自动注入,一般标识在构造器、set方法、成员变量上。如果找不到注入的实例,则抛出异常,可以通过required=true属性来避免。(如果使用required属性,则使用成员变量时应进行判断是否为空)

注意:每个类的构造器都可以使用@Autowired注解,但只能有一个构造器被标记为Autowired(required=true),required默认为false,这种情况下(解决多个构造器不能使用required属性),@Autowired的必要属性,建议使用@Required注解来代替。


注意:在使用@Service注解注册的bean时,最好如下(使用接口): service s =
applicationContext.getBean(“serviceImpl”);

Spring学习记录【一】_第24张图片
Spring学习记录【一】_第25张图片
Spring学习记录【一】_第26张图片



@Autowired注解说明2

Spring学习记录【一】_第27张图片
Spring学习记录【一】_第28张图片

@Autowired注解说明3(@Qualifier)

按类型自动装配可能有多个bean实例的情况,可以使用Spring的@Qualifier注解缩小范围或者指定唯一,也可以用于指定单独的构造器参数或方法参数,也可用于注解集合类型变量;

用法如下:
如果使用bean装配则不需要再Spring XML中配置,直接在bean类中使用 @Qualifier(“beanName”)
如果需要在Spring XML中配置,则在bean标签下添加,然后在bean类中使用@Qualifier(“名称”)


虽然@Resource和@Autowired都可以来完成注入依赖,但它们之间是有区别的。首先来看一下:

a。@Resource默认是按照名称来装配注入的,只有当找不到与名称匹配的bean才会按照类型来装配注入;
b。@Autowired默认是按照类型装配注入的,如果想按照名称来转配注入,则需要结合@Qualifier一起使用;
c。@Resource注解是又J2EE提供,而@Autowired是由spring提供,故减少系统对spring的依赖建议使用@Resource的方式;

@Bean

基于java的容器注解:
@Bean:由SpringIoc容器配置和初始化对象,类似于XML配置文件的。
(一般@Bean 需要在配置类中使用,即类上需要加上@Configuration注解)

@Bean的name属性:可以通过name属性指定Bean的Id,相当于XML中的Id。

@Component:如果一个类上标识该注解,表示配置类可以通过

@ComponentScan(“路径名”)扫描到该类,并实例化这个类。

Spring学习记录【一】_第29张图片
@Bean的initMethod属性、destroyMethod属性:通过@Bean实例化Bean时要执行的初始化和销毁逻辑。
Spring学习记录【一】_第30张图片


@ImportResource和@Value

property文件是key-value键值对形式的文件

加载资源文件


加载这个文件后,可以再当前文件中采用${jdbc.url}这种形式来使用配置文件中的内容.
例如:


如果使用注解则:
在类名前加上:

@Configuration
@ImportResource("classpath:/com/acme/propertied-config.xml")
//引入一个资源,对应一个xml文件中包含property_placeholder

在配置文件中使用username的时候需要注意:username输出有时会是登录用户的username,所以一般在配置文件中配置例如jdbc.username的形式以防止混淆.



Spring对JSR的支持

Spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource@PostConstruct以及@PreDestroy。
  @Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了。
  @Resource有两个属性是比较重要的,分是name和type,Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。

@Resource装配顺序
  1. 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
  2. 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
  3. 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常
  4. 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配;




Spring AOP

AOP 即 Aspect Oriented Program 面向切面编程.
首先,在面向切面编程的思想里面,把功能分为核心业务功能,和周边功能。
所谓的核心业务,比如登陆,增加数据,删除数据都叫核心业务
所谓的周边功能,比如性能统计,日志,事务管理等等

周边功能在Spring的面向切面编程AOP思想里,即被定义为切面 。

在面向切面编程AOP的思想里面,核心业务功能和切面功能分别独立进行开发
然后把切面功能和核心业务功能 “编织” 在一起,这就叫AOP。

在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程

AOP的基本概念
@Aspect(切面): 把增强用到具体的方法上面,就是把增强用到切入点上。、通常是一个类,里面可以定义切入点和通知

JointPoint(连接点): 程序执行过程中明确的点,一般是方法的调用

Advice(通知): 增强的逻辑,例如:扩展日志功能,日志功能称为增强

@Before: 标识一个前置增强方法,相当于BeforeAdvice的功能

@After: final增强,不管是抛出异常或者正常退出都会执行。

@AfterReturning: 后置增强,似于AfterReturningAdvice, 方法正常退出时执行

@AfterThrowing: 异常抛出增强,相当于ThrowsAdvice

@Around: 环绕增强,相当于MethodInterceptor

Pointcut(切入点): 带有通知的连接点,在程序中主要体现为书写切入点表达式

AOP Proxy:AOP框架创建的对象,代理就是目标对象的加强。Spring中的AOP代理可以使JDK动态代理,也可以是CGLIB代理,前者基于接口,后者基于子类。


(1):导相关包
(2):创建Spring核心配置文件,导入aop的约束
在这里插入图片描述
(3):使用表达式配置切入点

常用的表达式:
     execution(<访问修饰符>?<返回类型><方法名>(<参数>)<异常>)
            例如:
                (1) execution(* cn.itcast.aop.Book.add(..))
                (2)execution(* cn.itcast.aop.Book.*(..))
                (3)execution(* *.*(..))

AOP操作案例
Spring学习记录【一】_第31张图片

在服务器启动时候加载Spring配置文件

在这里插入图片描述
指定Spring核心配置文件的位置
Spring学习记录【一】_第32张图片


基于aspectj的注解AOP操作

1:创建对象
在这里插入图片描述

2:在Spring核心配置文件中,开启aop操作
在这里插入图片描述
3:在增强类上面使用注解完成aop操作
Spring学习记录【一】_第33张图片

你可能感兴趣的:(Spring学习记录【一】)