《Spring实战(第四版)》读书笔记

由于看书比较忘记,记录在网上,还可以时刻更新。。。

关键名称

DI   :    dependency injection: 依赖注入

AOP  : aspect-oriented programming  面向切面编程

POJO :plain old java object    简单老式java对象

EJB   : enterprise javaBean   企业级JavaBean

JDO    : java data object      java数据对象


第1章 Spring之旅

1.1 Spring的根本使命------简化java开发

(1)Spring非入侵式编程;

(2)依赖;

依赖注入:   通过DI,对象的依赖关系将由系统中负责协调各对象的第三方组件在创建对象的时候进行设定。对象无需自行创建或管理它们的依赖关系。

装配(wiring):创建应用组件之间的协作的行为通常称为装配。 Spring有多种装配bean的方式,采用XML是很常见的一种装配方式。也可以使用java语法装配。

通过依赖,我们的代码不需要知道哪个对象正在请求哪个操作,只需简单的调用一下接口函数即可。具体哪个对象执行哪个操作由XML文件的bean指出。

(3)面向切面编程;

允许你把遍布应用各处的功能分离出来形成可重用的组件。

主要是在XML文件中定义一个切面,这个切面被应用到类A,而类A根本就不用关心这个切面,事实上这个类A完全不知道切面的存在。

(4)样板式代码;

Spring皆在通过模板封装来消除样板式代码。


1.2 Spring容器----容纳你的Bean

在Spring的应用中,对象由Spring容器创建和装配,并存在于Spring容器中。

Spring容器:

(1)bean工厂,(太低级)

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

       AnnotationConfigApplicationContext  从一个或多个基于java的配置类中加载Spring应用上下文。

      AnnotationConfigWebApplicationContext   从一个或多个基于java的配置类中加载Spring Web应用上下文。

      ClassPathXmlApplicationContext 从路径下的一个或多个xml配置文件中加载上下文定义,把应用上下文的定义文件作为类资源。



本章结束:

    Spring致力于简化企业级java开发,促进代码的松散耦合,成功的关键在于依赖注入和AOP。


第2章 装配Bean

装配机制:

       (1)在XML中进行显示配置。

       (2)在JAVA中进行显示配置。

       (3)隐式Bean的发现机制和类中自动装配。

自动化装配

Spring的自动化装配:  

 (1)组件扫描(component scanning)   默认不启动,使用@ComponentScan开启。

            @Component 该类会作为组件类,并告诉Spring要为这个类创建bean。 可指定 Bean ID。 

                 @Named 为Bean命名,类似@Component。

            @ComponentScan 设置组建扫描的包,默认会扫描与配置类相同的包。包括子包。     对应<contest:component-scan>

 (2)自动装配(autowiring)

            @Autowired 指定bean装配到方法或者属性上。默认:如果没有匹配的bean,就会抛出异常; 如果有多个匹配的bean,也会抛出异常。

                 @Inject 大多数情况,是可以和@Autowired替换的。

通过java代码转配bean

@Configuration 表明这个类是一个配置类,该类应该包含在Spring应用上下文中如何创建bean的细节。

@Bean 会告诉Spring这个方法将会返回一个对象,该对象要注册为Spring应用上下文的bean。默认bean的ID与带@Bean注解的方法名是一样的,且带@Bean的方法都是单例。

通过XML装配bean

<bean class="soundsystem.SgtPeppers"/> 默认bean的ID是“soundsystem.SgtPeppers#0”

一般使用: <bean id="compactDisc" class="soundsystem.SgtPeppers"/>

(1)借住构造器注入初始化bean;   注入bean,注入字符串,注入集合。

(2)介入Setter方法实现属性注入;   注入bean,注入字符串,注入集合。

这(1)和(2)都比较简单。

混合配置

(1)在JavaConfig中引用XML配置

@Import 将另一个JavaConfig合并到当前的JavaConfig中。

@ImportResource 将XML文件合并到当前的JavaConfig中。

(2)在XML配置中引用JavaConfig

<import resource="cd-config.xml"/>  引用别的XML文件。

<bean class="soundsystem.CDConfig"/>   将JavaConfig导入到XML配置中。

第3章 高级装配

环境与Profile

profile可以理解为环境,在一个程序,要在多个环境中跑,比如开发环境,测试环境。环境不一样,有些bean的配置也不一样。

配置profile bean要分两部走:

(1)将不同bean的定义整理到一个或多个profile中

    @Profile指定改bean属于哪一个profile。

           对应<beans ...  profile="dev">  ... </beans>   

(2)将对应的profile激活

spring.profiles.active 确定哪个profile是激活的

spring.profiles.default 如果没有配置spring.profiles.active,则该属性生效。

如果上述两个属性都没有配置,那么只会创建没有定义在profile中的bean。

条件化的bean声明

只有满足某个条件后,才会创建某个bean。

@Conditional 用在带@bean的方法上,如果给定的条件计算结果为真,就创建这个bean。

自动装配与歧义性

当定义了多个同一接口的bean时,Spring无法知道应该装配那个bean。

解决办法:首选(primary)  限定符(qualifier)

@Primary 与@Component组合使用,或者与@Bean组合使用

     <bean ... primary = "true" />

@Qualifier 在注入的时候指定想要注入进去的是哪个bean。(使用bean ID指定)

    可自定义限定符,而不是使用bean ID,这样做的好处是与bean ID解藕,也是使用@Qualifier注解定义在类上。

    可在注入点定义多个限定符,目的是缩小限定符的范围。(这个知识点好像有问题,待求证 )

可以自己创建一个新的@Creamy注解来代替@Qualifier("Creamy") 。

bean的作用域

默认,所有bean都是以单例的形式创建的。

Spring定义了多种作用域:

(1)单例(Singleton):整个应用中,只创建一个实例。

(2)原型(Prototype):每次注入都创建一个新的实例。

(3)会话(Session):在web应用中。

(4)请求(Request):在web应用中。

@Scope 与@Component或@Bean一起使用。用来声明bean的作用域。

例:  @Scope(value=WebApplicationContext.SCOPE_SESSION, proxyMode=ScopedProxyMode.INTERFACES)

          <aop:scoped-proxy>

运行时值注入

将一个值注入到bean的属性或者构造参数中,我们希望这个值是在运行时再确定。

Spring提供了两种在运行时求值的方式:

(1)属性占位符(Property Placeholder)

(2)Spring表达式语言(SpEL)

@PropertySource 声明属性源,常常是一个文件。

Environment类,有一下常用函数。

有4个 getProperty() 重载变体  
getRequiredProperty() 要求这个属性必需存在
containsProperty() 检查某个属性是否存在
getPropertyAsClass() 就将属性解析为类
getActiveProfiles()  
getDefaultProfiles()  
acceptsProfiles()  

“ ${...} ” 占位符。例:

<bean id="sgtPeppers" class="soubdsystem.BlankDisc" c:_title="${disc.title}" c:_artist="${disc.artist}">

     @Value 作用同上


SpEL表达式要放在“ #{...} ” ,(内容多,请看书)。


第4章 面向切面的Spring

理解概念:通知,连接点,切点,切面,引入,织入。

@Aspect 表明该类不仅是一个POJO,而且还是一个切面。

@Pointcut 定义可重用的切点。

@EnableAspectJAutoProxy 启动自动代理。

@Around 环绕通知。


第5章 构建spring web 应用程序

使用gradle 导入代码即可,版本jdk1.8,tomcat9.0,gradle4.0

编译,选择"run on server"




第6章 渲染Web视图

导入代码后,需要修改WebConfig.java文件,修改为:


将spring3修改为spring4.






猜你喜欢

转载自blog.csdn.net/gs344937933/article/details/80675440