Spring学习记录【一】

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



什么是Spring

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

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

两种实现: 依赖查找(DL)和依赖注入(DI)
注:DL已被抛弃,因为他需要用户自己去是使用 API 进行查找资源和组装对象。在这里插入图片描述

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

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


开发步骤

1)下载Spring的开发包.

2)创建web项目,引入Spring的开发包
在这里插入图片描述
3)引入相关配置文件

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

在这里插入图片描述

4)编写相关的类
在这里插入图片描述

5)完成配置配置对象创建(这里xml(就是配置文件方式)配置)

6)编写测试程序
在这里插入图片描述




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.使用有参数构造注入属性
在这里插入图片描述
在这里插入图片描述
2:使用set方法注入属性(重点
在这里插入图片描述
在这里插入图片描述

注入对象类型属性

在这里插入图片描述
在这里插入图片描述

8:注解注入属性:需求:在service中得到dao对象
(1)创建dao和service对象
在这里插入图片描述




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

2.1 注入对象属性第一个 注解 @Autowired
在这里插入图片描述

2.注入对象属性第二个 注解 @Resource(常用,因为这个可以注明对象名)
在这里插入图片描述




在这里插入图片描述

@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:注解开发就得,开启注解扫描

在这里插入图片描述

5:注解创建对象
在这里插入图片描述

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

7:创建对象是单实例还是多实例
在这里插入图片描述
在这里插入图片描述




在这里插入图片描述

Aware接口

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

在这里插入图片描述

注解对象

自动装配

参考博客:https://www.jianshu.com/p/32c3f895a3b5
在这里插入图片描述
在这里插入图片描述
spring的自动注入set方法注入构造器注入,都需要在ioc容器中显示的声明property或contructor.
不显示的声明,可以用bean的自动装配在beans中配置default-autowire="byName/byType/No/Constructor"等。使得bean的ioc容器显得更加简洁。

Resources

在这里插入图片描述

四种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 容器中,相当于配置文件中的<bean id="xxx" class="xxx"/>

元注解

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

类的自动监测及 Bean 的注册

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

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

<context:  component-scan  base-package="包名" />

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

默认情况下,类被自动发现并注册 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”);

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述



@Autowired注解说明2

在这里插入图片描述
在这里插入图片描述

@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(“路径名”)扫描到该类,并实例化这个类。

在这里插入图片描述
@Bean的initMethod属性、destroyMethod属性:通过@Bean实例化Bean时要执行的初始化和销毁逻辑。
在这里插入图片描述


@ImportResource和@Value

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

加载资源文件

<context:property-placeholder location="classpath:/com/acme/jdbc.propertied"/>

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

<property name="url" 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配置文件

在这里插入图片描述
指定Spring核心配置文件的位置
在这里插入图片描述


基于aspectj的注解AOP操作

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

2:在Spring核心配置文件中,开启aop操作
在这里插入图片描述
3:在增强类上面使用注解完成aop操作
在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring是一个开源的Java框架,用于构建企业级应用程序。它提供了一种轻量级的、非侵入式的开发方式,通过依赖注入和面向切面编程等特性,简化了Java应用程序的开发过程。 以下是关于Spring学习的一些笔记: 1. IoC(控制反转):Spring通过IoC容器管理对象的创建和依赖关系的注入。通过配置文件或注解,将对象的创建和依赖关系的维护交给Spring容器来管理,降低了组件之间的耦合度。 2. DI(依赖注入):Spring通过依赖注入将对象之间的依赖关系解耦。通过构造函数、Setter方法或注解,将依赖的对象注入到目标对象中,使得对象之间的关系更加灵活和可维护。 3. AOP(面向切面编程):Spring提供了AOP的支持,可以将与业务逻辑无关的横切关注点(如日志、事务管理等)从业务逻辑中分离出来,提高了代码的可重用性和可维护性。 4. MVC(模型-视图-控制器):Spring提供了一个MVC框架,用于构建Web应用程序。通过DispatcherServlet、Controller、ViewResolver等组件,实现了请求的分发和处理,将业务逻辑和视图展示进行了分离。 5. JDBC和ORM支持:Spring提供了对JDBC和ORM框架(如Hibernate、MyBatis)的集成支持,简化了数据库访问的操作,提高了开发效率。 6. 事务管理:Spring提供了对事务的支持,通过声明式事务管理和编程式事务管理,实现了对数据库事务的控制和管理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值