spring实战笔记:spring核心

     2022-03-28     783

关键词:

spring core


一.简介:

 1.依赖注入(DI)

    优点:解耦

    Spring 通过应用上下文(Application Context)装载bean的定义,并把它们组装起来。

    Spring应用上下文负责对象的创建和组装。

        ClassPathXmlApplicationContext加载Spring上下文(ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("META-INF/spring/xxx.xml"),可通过context获取bean)


2. 应用切面

    面向切面编程(aspect-Oriented programming,AOP):可以将遍布应用各处的功能解耦出来,形成可重用的组件。关注点的分离。


3.Bean

    基于Spring的应用中,,应用对象生存于Spring容器中。Spring容器负责创建对象,装配对象,配置他们并管理他们的整个生命周期,从new到finalize()。

    bean可以通过@Component("beanName")或@Named("beanName")来命名。其中@Named是Java依赖注入规范中提供的。

    Spring容器不只有一个,Spring自带了多个容器实现,可以归为两种不同类型:

        --bean工厂:最简单的容器,提供基本DI支持;

        --应用上下文:基于BeanFactory构建,并提供应用框架级别的服务。(应用较多)

    BeanFactory和FactoryBean的区别( https://www.cnblogs.com/redcool/p/6413461.html):

        BeanFactory是一个工厂类,用于管理Bean的一个工厂。BeanFactory是IOC容器的核心接口,负责实例化,定位,配置应用程序中的对象及建立这些对象间的依赖。

        FactoryBean是实现了FactoryBean<T>接口的Bean。根据该Bean的ID从BeanFactory中获取的实际上是FactoryBean的getObject()返回的对象,而不是FactoryBean本身,若要获取FactoryBean本身需要在id前面加一个&符号。

        

二.装配Bean

    将组件扫描得到的bean和他们的依赖装配在一起

1.自动扫描组件

    @Controller控制器:注入服务

    @Service服务:注入Dao

    @Repository Dao:实现Dao访问

    @Component:把普通的POJO实例化到Spring容器中,相当于配置文件中的<bean id="" class=""/>

    @Controller,@Service,@Repository,@Component注解的类,并把这些类纳入进Spring容器中进行管理。

    引入Component的扫描组件:

    其中base-package是需要扫描的包(含所有子包)

<context:component-scan base-package="com.best"/>

    可以使用@Configuration替代xml配置,@ComponentScan(basePackages={"",""})指定扫描组件的包及子包下带有@Component注解的类。@ComponentScan默认扫描所在类的包及子包。

    @Controller:用于标注控制层组件

    @Service:用于标注业务层组件

    @Repository:用于标注数据访问层组件,即DAO组件

    @Component:泛指组件,当组件不好归类时,可使用该注解进行标注。

    @Controller,@Service,@Repository,@Component注解的类,并把这些类纳入进Spring容器中进行管理。


2.自动装配

    @Autowired可以用在构造方法和类的方法上。spring会满足方法参数上所声明的依赖。

        -- 如果没有匹配的bean:在应用上下文创建的时候,Spring会抛出异常,为避免异常可以使用@Autowired(required=false)

        -- 有匹配的bean时:若使用了@Autowired(required=false),在代码没有进行null检查时,这个处于未装配状态的属性可能会抛出NullPointException。

    @Inject也可以完成自动装配,是Java依赖注入规范中提供的。

       

三.高级装配

    @Profile("dev")  -----为dev环境 profile装配的bean

        使用Profile首先要将所有不同的bean定义整理到一个活多个Profile中,在将应用部署到每个环境时,要确保对应的Profile处理激活(active)状态,只有当规定的profile被激活时,相应的bean才会被创建。

        使用@Profile注解指定某个bean属于哪一个Profile。

        激活profile方法:

            -- 作为DispatcherServlet的初始化参数;

            -- 作为WEB应用的上下文参数;

            -- 作为JNDI条目;

            -- 作为环境变量;

            -- 作为JVM的系统属性;

            -- 在集成测试类上,使用@ActiveProfiles注解设置:@ActiveProfiles("dev")

    @Conditional(xxxCondition.class)  -----条件化地创建bean

        可以用到带有@Bean注解的方法上,如果给定条件计算结果为true,就会创建这个bean,否则这个bean将会被忽略。

        设置给Conditional的类可以是任意实现了Condition接口的类型,这个接口只需提供matches()方法的实现即可。matches()方法返回true就会创建带有  @Conditional注解的bean。

    @Autowired

        使用自动装配让Spring完全负责将bean引用注入到构造参数和属性中,能够减少装配应用程序组件时所需的显示配置的数量。

        如果有多个bean能够匹配结果时Spring会抛出NoUniqueBeanDefinitionException。

        此时可以将可选bean中的某一个设为首选(@Primary,Primary与@Component或@Bean一起使用)的bean 或使用限定符(@Qualifier("xxxbeanName"),Qualifier与@Autowired一起使用)来帮助Spring将可选的bean范围缩小到只有一个bean。

        Qualifier也可以与@Component或@Bean一起使用,为某一个bean设置beanName即创建自定义的限定符,以防止bean类名修改导致找不到Qualifier指定beanName。


1.bean的作用域

    默认情况下,Spring应用上下文中所有bean都是作为一单例(singleton)的形式创建的。即不管给定的一个bean被注入到其他bean多少次,每次所注入的都是同一个实例。

    当所使用的类是异变的(mutable),他们会保持一些状态,此时重用是不安全的。

    Spring定义了多种作用域,可以基于这些作用域创建bean:

        -- 单例(Singleton):在整个应用中,只创建bean的一个实例;

        -- 原型(Prototype):每次注入或通过Spring应用上下文获取的时候,都会创建一个bean实例;

        -- 会话(Session):在Web应用中,为每个会话创建一个bean实例;

        -- 请求(Request):在Web应用中,为每个请求创建一个bean实例。

    单例是默认作用域,如果要选择其他作用域,要使用@Scope注解,与@Component或@Bean一起使用:

        -- 原型:@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)或@Scope("prototype")

        -- 会话:@Scope(value=WebApplicationContext.SCOPE_SESSION, proxyMode=ScopedProxyMode.INTERFACES)

        -- 请求:@Scope(value=WebApplicationContext.SCOPE_REQUEST, proxyMode=ScopedProxyMode.INTERFACES)

    当一个会话或者请求作用域的bean(BeanSession)要注入到单例作用域的bean(BeanSingle)中时,会出现一些问题:

        -- BeanSingle在Spring应用上下文加载的时候创建,此时Spring会试图将BeanSession注入到BeanSingle中,而此时BeanSession还不存在(当有用户进入系统,创建会话后才会被创建)。

        -- 系统中可能会存在多个BeanSession,大多数情况下我们不希望注入一个固定的BeanSession到BeanSingle中,而是当前Session中的那个。

        为了解决这个问题,Spring不会将实际的BeanSession注入到BeanSingle中去,而是注入一个BeanSession的代理。这个代理会暴露出和BeanSession相同的方法,BeanSingle会认为它是一个普通的BeanSession。

        @Scope注解有一个proxyMode属性,用于配置代理。有两种方式:

            -- ScopeProxyMode.INTERFACES,这表明该代理会实现BeanSession接口,并将调用 委托给具体的实现bean。这种方法要求BeanSession是一个接口。

            -- ScopeProxyMode.TARGET_CLASS,这表明Spring会使用CGLib生成目标类的扩展的方式来创建代理。这种方式适用于BeanSession是具体的类。

技术分享图片

2.运行时值注入

    依赖注入通常是指将一个bean引用注入到另一个bean的属性或构造器参数中。它通常来讲是指将一个对象与另一个对象进行关联。

    依赖注入能够将组件及其协作的其他组件解耦。

    bean的装配另一个方面是将一个值注入到bean的属性或构造器参数中。

    Spring的两种运行时求值的方式:

        -- 属性占位符(Property placeholder):较简单;

        -- Spring表达式语言(SpEL):较强大。

    占位符的形式为使用"${...}"包装的属性名称,使用XML配置Spring context命名空间:

<context:property-placeholder location="classpath*:redis.properties,classpath*:shiro.properties"
ignore-unresolvable="true"/>
<!--remember Cookie-->
<bean id="rememberMeCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
<constructor-arg value="${shiro.cookie.name.prefix}-rememberMe"/>
<property name="httpOnly" value="true"/>
<property name="maxAge" value="2592000"/>
</bean>

    Spring表达式语言能够以一种强大简洁的方式将值装配到bean属性和构造器参数中,在这个过程中所使用的表达式会在运行时计算得到值。

    SpEL拥有如下特性:

        -- 使用bean的ID来引用bean;

        -- 调用方法和访问对象的属性;

        -- 对值进行算术、关系和逻辑运算;

        -- 正则表达式匹配;

        -- 集合操作。

    SpEL表达式要放到"#{...}"之中:

<bean id="rememberMeManager" class="org.apache.shiro.web.mgt.CookieRememberMeManager">
<!– rememberMe cookie加密的密钥 建议每个项目都不一样 默认AES算法 密钥长度(128 256 512 位)–>
<property name="cipherKey" value="#{T(org.apache.shiro.codec.Base64).decode('GHxH6G3LFh8Zb3NwoRgfFA==')}"/>
<property name="cookie" ref="rememberMeCookie"/>
</bean>


前方高能预警!阿里大佬出品“spring实战学习笔记”震撼来袭

Spring框架已经成为Java开发人员的必备知识,而且Spring3引入了强大的新特性,例如SpEL、Spring表达式语言、loC容器的新注解以及用户急需的对REST的支持。无论你是刚刚接触Spring还是被Spring3.0的新特性所吸引,这份笔记... 查看详情

前方高能预警!阿里大佬出品“spring实战学习笔记”震撼来袭!(代码片段)

Spring框架已经成为Java开发人员的必备知识,而且Spring3引入了强大的新特性,例如SpEL、Spring表达式语言、loC容器的新注解以及用户急需的对REST的支持。无论你是刚刚接触Spring还是被Spring3.0的新特性所吸引,这份笔记... 查看详情

阅读笔记《javaee企业应用实战》(第四版)第七章——spring的基本用法

Spring的定义和相关知识点Spring包括基于依赖注入的核心机制(再也不用new一个对象啦)基于AOP的声明式事物管理与多种持久层技术的整合WebMVC框架Spring的优点低侵入式设计,代码污染低独立于各种应用服务器,基于Spring框架的应... 查看详情

spring实战--1spring的核心

  最近面试总会涉及Spring的优点,SpringMVC与Struts2的比较,生活慢慢稳定下来,这些面试还是应了那句话“只顾盲目拉车,不会低头看路”,回过头来还是要好好研究一下Spring,如果仅仅是停留在粘贴拷贝像从前一样机械... 查看详情

spring实战笔记:spring集成

...是客户端应用和服务端之间的会话。    1.Spring通过多种远程调用技术支持RPC(remoteprocedurecall,远程过程调用)RPC模型使用场景RMI不考虑网络限制时(例如防火墙),访问/发布基于Java的服务Hessian或Burlap考虑网络限... 查看详情

java实战之03spring-02spring的核心之ioc

二、Spring的核心之IoC(InversionofControl控制反转)1、IoC是什么?回顾:连接池原理中的使用。注意:我们在连接池原理中是使用构造函数注入的,当然还可以通过提供set方法实现注入。    2、Spring容器Spring容器简单... 查看详情

spring实战笔记二

一、Spring配置的方式    spring容器用来创建应用程序中的bean,并通过DI来协调这些对象间的关系。    在bean进行装配时,spring提供了三种主要的装配机制。      ①在XML中进行显式配置      ②在Java中进... 查看详情

spring实战笔记:web中的spring

一.构建SpringWeb应用1.SpringMVC中用户请求处理  上图展示了请求使用SpringMVC所经历的所有站点。  1:在请求离开浏览器时,会带有所有请求内容的信息,至少会包含请求的URL。     请求通过Spring的Di... 查看详情

spring实战笔记:后端中的spring

...用ORM工具可以节省术前行代码和大量开发时间。  Spring对ORM框架的支持提供了与这些框架的集成点以及一些附加的服务:     --支持集成Spr 查看详情

spring实战笔记一

1、是什么?  Spring是一个开源的框架,是为了解决企业级应用开发的复杂性而创建的。   简而言之,Spring是为简化Java开发而创建的。 2、如何简化开发?  为了降低java开发的复杂性,Spring采用了4中关键策略。 ... 查看详情

高质量spring实战学习笔记,腾讯内部学习spring首推

Spring框架已经成为Java开发人员的必备知识,而且Spring3引入了强大的新特性,例如SpEL、Spring表达式语言、loC容器的新注解以及用户急需的对REST的支持。无论你是刚刚接触Spring还是被Spring3.0的新特性所吸引,这份笔记... 查看详情

spring4实战学习笔记

《Spring4实战第4版》2016年4月新出版的,之前的第三版看起来还是不错的,所以看到新版就直接买下来。英文版源码地址:SpringinAction,FourthEditionCoversSpring4 1.IOC装配Bean参考【Spring实战4 2.2】,作者提倡无XML配置化... 查看详情

java实战之03spring-03spring的核心之aop(aspectorientedprogramming面向切面编程)

三、Spring的核心之AOP(AspectOrientedProgramming 面向切面编程)1、AOP概念及原理1.1、什么是AOPOOP:ObjectOrientedProgramming面向对象编程AOP:AspectOrientedProgramming面向切面编程1.2、代理充分理解:间接主要作用:拦截被代理对象执行的... 查看详情

spring实战读书笔记spring装配bean(代码片段)

...过Xml装配Bean借助构造器注入初始化bean设置属性混合配置Spring容器负责创建应用程序中的bean并通过DI来装配(wiring)他们。Spring有三种装配方式,三种方式可以搭配使用 (1)隐式的bean发现 查看详情

前方高能预警!阿里大佬出品“spring实战学习笔记”震撼来袭

Spring框架已经成为Java开发人员的必备知识,而且Spring3引入了强大的新特性,例如SpEL、Spring表达式语言、loC容器的新注解以及用户急需的对REST的支持。无论你是刚刚接触Spring还是被Spring3.0的新特性所吸引,这份笔记... 查看详情

spring实战读书笔记spring之旅(代码片段)

Spring可以做很多事情,但是这个事情底层都依赖于2个核心特征:依赖注入(DI)和面向切面编程(AOP)概念:POJO:简单java对象,PlainOldJavaObject,在Spring中基本可以等同于javabean为了简化Java... 查看详情

ssm实战的问题和处理方法----wsdchong

...第一阶段--理论了解的过程首先是4/20开始写的笔记:​​spring学习笔记​​、​​mybatis学习笔记​​、​​springmvc学习笔记​​、​​用SSM框架开发新闻管理系统笔记​​。在写笔记的过程,算是初步了解spring的IOC、AOP、bean、... 查看详情

前方高能预警!阿里大佬出品“spring实战学习笔记”震撼来袭!(代码片段)

Spring框架已经成为Java开发人员的必备知识,而且Spring3引入了强大的新特性,例如SpEL、Spring表达式语言、loC容器的新注解以及用户急需的对REST的支持。无论你是刚刚接触Spring还是被Spring3.0的新特性所吸引,这份笔记... 查看详情