关键词:
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的新特性所吸引,这份笔记... 查看详情