《Spring实战》_笔记


基于《Spring实战》。

第1部分 Spring的核心

依赖注入DI,面向切面编程AOP。

第1章 Spring之旅

1.1 简化Java开发
Spring简化Java开发的策略:
基于POJO的轻量级和最小侵入性编程
通过依赖注入、面向接口实现松耦合
基于切面和惯例进行声明式编程
通过切面和模板减少样板式代码
面向切面编程,关注点分离。
1.2 容纳你的Bean
Spring Bean容器:BeanFactory类、ApplicationContext类。
Bean生命周期:实例化、填充属性、调用实现的特定接口方法、使用、销毁。
1.3 俯瞰Spring风景线
Spring框架模块类型:数据访问与集成、Web与远程调用、面向切面编程、instrument、Spring核心容器、测试。

第2章 装配Bean

Spring主要装配方式:XML配置、JavaConfig配置、隐式的Bean发现机制和自动装配。
Spring自动化装配:组件扫描(发现bean)+自动装配(注入值)
@ComponentScan(basePackageClasses={A.class,B.class});设置扫描类所在包,避免了basePackages的类型不安全。可在扫描包内添加空标记接口,专用于指定扫描包。
2.3 通过Java代码装配bean
@Configuration+@Bean
带有@Bean注解的方法可以采用任何必要的Java功能来产生bean实例。
@Bean注解的bean实例bean id默认为方法名,自定义:@Bean(name=beanName)
2.4 通过XML装配
File–New–Spring Bean Configuration File;创建XML配置文件。
构造器注入:、c-命名空间。
属性注入:、p-命名空间。
ref/-ref引用,value值。、,数组或者集合。util-命名空间,创建集合、数组等bean。
2.5 导入和混合配置
javaConfig,@Import、@ImportResource;导入和混合配置。
xml,、;导入配置后,通过id获取需要的bean。
创建根配置,导入JavaConfig、xml文件;并在根配置启用组件扫描。

第3章 高级装配

3.1 环境与profile
不同环境,条件、配置不一样;maven-profiles,编译时过滤;spring-profiles,运行时过滤(@profileName@,引用maven profile)。
设置profile值:

  1. spring.profiles.active/default;通过JVM、环境变量、web.xml设置。
  2. ApplicationContext().getEnvironment.setActiveProfiles(“profileName”)
  3. javaConfig,@Profile(“profileName”);可加在类、方法上(spring 3.2后)。
  4. @ActiveProfiles(“profileName”);测试时使用。
  5. xml,;可在beans中重复定义标签。

3.2 条件化的bean
@Conditional(A.class);A 实现Condition接口,通过matches返回结果,true创建bean。
3.3 处理自动装配的歧义性
@Primary、;设为首选
@Qualifier,标记限定符;默认为bean id,可自定义@Qualifier(“name”)。
创建自定义的限定符注解。
3.4 bean的作用域
默认情况下,spring应用上下文中的bean都以单例形式创建。
@Scope,作用域注解;值:单例singleton、原型prototype、会话session、请求request。
会话、请求作用域:
@Scope(value=“session”,proxyMode=ScopedProxyMode.INTERFACES/TARGET_CLASS)
xml中,声明作用域代理,需导入aop命名空间,默认为代理类:

<bean scope="session"> 
	<aop:scoped-proxy proxy-target-class="false"/>  
</bean> 

3.5 运行时值注入
@PropertySource只能加载properties文件。
属性占位符(${exp}),@Value("${exp}")根据名称解析来自于Spring Environment和属性源的属性。
配置占位符解析:xml,<context: property-placeholder />;location属性制定文件位置。
javaConfig,获取对应bean;PropertySourcesPlaceholderConfigurer。
Spring表达式语言(#{exp}),@Value("#{exp}")

  1. #{ 1、true、“hi” };字面量
  2. #{ person、person.name、person.getState() };person为beanID,引用bean及其属性、方法
  3. #{ T(java.lang.Math).PI、T(Math).random() };引用静态变量、方法
  4. 运算符:
    算术运算:+、-、*、/、%、^(方次,#{T(Math).PI^2)
    比较运算:>、<、==、>=、<=、gt、lt、eq、ge、le
    逻辑运算:and、or、not、|
    条件运算:?:;用于判定null时可简写,#{ person.name?:“Bruce” }
    正则表达式:matches;#{ person.name matches ‘\w+’ }
    集合计算: [ ]、.?[ ]、.^[ ]、.$[ ]、.![ ]

第4章 面向切面的Spring

散布于应用中多处的功能称为横切关注点。
4.1 什么是面向切面编程
术语:通知advice、连接点join point、切点pointcut、切面aspect、引入introduction、织入weaving。
Spring在运行时通知对象,只支持方法连接点(不支持字段、构造器);在加载bean时创建被代理的对象。
4.2 通过切点来选择连接点
Spring只支持AspectJ切点指示器的一个子集。
excution(),匹配连接点;execution(* bonc.DataSourceConfig.getProperties(..))

  1. * bonc.*.*(..),bonc包下所有类所有方法,形参列表为任意;返回类型任意,
  2. int bonc..*.*(*),bonc包及其子包下所有类所有方法,形参列表只有一个参数;返回类型为int
  3. public * bonc.*Controller.set*(..); 修饰符为public,类名以Controller结尾,方法名以set开始
  4. 限定符:arg()、@arg()、this()、target()、@target()、within()、@within()、@annotation。
  5. Spring指示器:bean(),筛选bean id。
  6. 运算符:and、or、not、&&(xml中使用and)、|、!;
    例:excution(* bonc.DataSourceConfig.getProperties(..)) && within(bonc.*)

4.3 使用注解创建切面
@Aspect、@Before、@After、@AfterThrowing、@AfterReturning、@Around;定义切面
@Pointcut,定义可重用切入点,通过标注的方法名引用。
@EnableAspectAutoProxy,启用自动代理功能,标记在配置类上。
环绕通知@Around,方法必须带参ProceedingJoinPoint jp;jp.proceed()执行被代理方法。
传递被代理方法参数:

@Pointcut("execution(* bonc.CompactDisc.playTrack(int)) && args(trackNumber)")//切点
public void trackPlayed(trackNumber){}
@Before("trackPlayed(trackNumber)")//引入本类pointcut时,直接写方法名
public void countTrack(int trackNumber){}  //通过形参trackNumber接受参数

4.4 在XML中声明切面
使用aop命名空间,<aop: *>:

  • <aop: config>;顶层AOP配置,aop根标签
  • <aop: aspect>、<aop: advisor>;定义切面,advisor一般用于事务
  • <aop: before/ after/ after-returning/ after-throwing/ around>
  • <aop: pointcut>、<aop: aspectj-autoproxy>、<aop: declare-parents>

4.5 注入AspectJ切面
创建AspectJ项目,配置切面切点,Spring注入属性(aspectOf方法)。

第2部分 Web中的Spring

第5章 构建Spring Web应用程序

5.1 Spring MVC起步
继承AbstractAnnotationConfigDispathcherServletInitializer;重写其方法,将路径映射到DispatherServlet、加载两个应用上下文。
配置两个应用上下文的javaConfig类;标记@ComponentScan、@EnableWebMvc
5.2 编写基本的控制器
@Controller+@RequestMapping;@RequestMapping的value可为数组,对应多个路径
通过形参Model/Map model传递查询结果,在jsp中使用JSTL从request获取。
5.3 接受请求的输入
请求输入为String类型,自动转换为对应的形参类型。
路径变量,@RequestMapping("/hello/{name}")+@PathVariable
查询参数,@RequestMapping("/get")+@RequestParam
表单参数,通过形参对象接收请求体的输入变量。
表单参数校验:@AssertFalse、@AssertTrue、@DecimalMax、@DecimalMin、@Digits、@Max、@Min、@NotNull、@Null、@Future、@Past、@Pattern、@Size
返回内容,"redirect: …"重定向,"forward: …"前往,返回Model/Map时默认前往匹配路径的视图。
何时使用路径变量,何时使用查询参数?参数为资源id时,使用路径变量。

第6章 渲染Web视图

6.1 理解视图解析
视图解析器接受视图名,返回View实例;View实例接收model、request、response,并将渲染内容放到response中。
视图解析器一般对应一种视图技术:InternalResourceViewResolver–JSP,TilesViewResolver–Apace Tiles.
6.2 创建JSP视图
Spring提供两种支持JSP视图的方式:JSTL、Spring标签库(少用)。
使用JSTL时,InternalResourceViewResolver配置viewClass为JstlView.class。
6.3 使用Apache Tiles视图定义布局
6.4 使用Thymeleaf
配置3个bean:TemplateResolver、SpringTemplateEngine、ThymeleafViewResolver
th: *,thymeleaf属性;值:${}变量表达式、*{}选择表达式、@{}URL表达式、#{}文字国际化表达式

第7章 Spring MVC的高级技术

7.1 Spring MVC配置的替代方案
自定义DispatcherServlet配置,重写AbstractAnnotationConfigDispathcherServletInitializer–customizeRegistration方法,传入自定义配置文件。
加载其他Servlet、Filter等,实现WebApplicationInitializer,重写onStartup方法。
web.xml,部署描述文件,根标签;Servlet规范定义的,web应用的配置文件。
web.xml中包含Spring配置、SpringMVC配置、过滤器监听器配置;
7.2 处理multipart形式的数据
表单设置multipart格式:<form enctype=“multipart/form-data”>…</form>;表单中有input-file。
配置multipart解析器bean:CommonsMultipartResolver(可用于Servlet3.0前,bean方法中加载配置)、StandardServletMultipartResolver(MultipartConfigElement加载配置)。
controller方法中,形参(byte[]、MultipartFile、Part)加@RequestPart,接受文件。
7.3 处理异常
controller方法抛出异常,统一处理。
@ResponseStatus,标记异常类;将异常映射为状态码。
@ExceptionHandler,标记controller方法,处理类中异常。
@ControllerAdvice,标记类;类中@ExceptionHandler标记方法应用到所有控制器中带有@RequestMappiing的方法中自行处理。
7.5 跨重定向请求传递数据
通过URL模板传递参数;model中包含name=lee,id=1;return “redirect: /get/{name}”;实际客户端请求:/get/lee?id=1。{}为占位符,转义不安全字符,model中未匹配的属性以查询参数附加到URL。
形参model声明为RedirectAttributes(Model子接口)实例,调用addFlashAttribute();重定向前将属性复制到会话中,重定向后从会话转移到模型中。

第9章 保护Web应用

9.1 Spring Security简介
@EnableWebSecurity/@EnableWebMvcSecurity(Spring MVC,可通过@AuthenticationPrincipal注解的参数获取认证用户的principal/username);启用Web安全功能。
创建配置类继承WebSecurityConfigurer/WebSecurityConfigurerAdapter(更简单),重写配置认证configure(WebSecurity) 配置Spring Security filter链,configure(HttpSecurity) 配置拦截器保护。
配置DelegatingFilterProxy,将过滤逻辑委托给指定filter(spring自动创建)。xml–<filter>;java创建继承AbstractSecurityWebApplicationInitializer的类。
9.2 选择查询用户详细信息的服务
configure(AuthenticationManagerBuilder amb);配置用户验证方式
内存用户方式
amb.inMemoryAuthentication();
withUser(“uname”).password(“pwd”).roles(…role);配置用户,and()连接多个用户
数据库查询
amb.jdbcAuthentication().dataSource(dataSource);配置为从数据库查询
usersByUsernameQuery(sql),authoritiesByUsernameQuery(sql),groupAuthoritiesByUsernameQuery(sql);配置自定义权限查询语句。
passwordEncoder(PasswordEncoder);配置密码转换器,转码输入密码后与数据库密码匹配
LDAP认证
amb.ladpAuthentication();配置为LDAP认证
userSearchBase()/groupSearchBase();指定查询组织单元,默认为根节点
userSearchFilter()/groupSearchFilter();指定节点过滤条件
passwordCompare();配置密码比对认证,默认为两次绑定认证(推荐)。
passwordEncoder()/passwordAttribute();配置密码加密器、密码存储属性(默认为userPassword)
contextSource().url(“url”);指定远程LDAP服务器地址
contextSource().root();配置嵌入式LDAP服务器
自定义用户认证
amb.userDetailService(new UserDetailServiceImpl(repository));自定义认证
UserDetailServiceImpl实现UserDetailService:UserDetails loadUserByUsername("uname)
9.3 拦截请求
configure(HttpSecurity http);
http.authorizeRequest();配置拦截请求
antMatchers()/regexMathers()/anyRequest();匹配路径,按顺序匹配,具体路径在前。
authenticated()/permitAll()/denyAll();设置认证
access(“SpEL”);通过SpELl值确定是否通过验证,true-通过
9.4 认证用户
configure(HttpSecurity http);
formLogin().loginPage(“loginUrl”);设置登录页面url
logout().logoutUrl(“logoutUrl”).logoutSuccessUrl(“url”);设置登出url,登出成功跳转url
httpBasic();启用HTTP Basic认证
rememberMe().tokenValiditySeconds(time).key(“name”);启用rememberMe功能,
9.5 保护视图
通过Spring Security标签,条件性渲染视图。

第3部分 后端中的Spring

第11章 使用对象-关系映射持久化数据

11.1 在Spring中集成Hibernate
配置SessionFactory bean,将SessionFactory bean注入dao,获取Session,查询数据。
自动类型转换:配置PersistentceExceptionTranslationPostProcessor bean。
mybatis,配置sqlSessionFactory。
11.2 Spring与Java持久化API
配置实体管理工厂bean,注入dao(@PersistenceUnit标记属性),获取实体管理器,查询数据。
EntityManager线程不安全,如需直接注入EntityManager bean,添加@PersistenceContext;此时注入EntityManager的代理,实际的EntityManager是与当前事务相关联的那一个。
自动类型转换:配置PersistentceExceptionTranslationPostProcessor bean。
11.3 借助Spring Data实现自动化的JPA Repository
@EnableJpaRepository,开启Spring Data JPA;继承JpaRepository实现repository;注入查询。
Spring Data的领域特定语言DSL,动词+主题+断言:

  • 动词,get、read、find、count;前三个同义,count返回数量
  • 主题,可省;查询对象的类型由参数化JpaRepository接口时确定。主题名以Distinct开头,返回非重复结果集。
  • 断言,By开头,限制结果集属性;断言中包含一个或多个限制条件,And、Or连接,每个条件必须引用一个属性,并可指定一种比较操作,如果省略比较操作符,默认为相等操作。
  • 排序,OrderBy;可加多个排序属性,属性后根Asc、Desc。

@Query,声明自定义查询;value为sql,native,true-sql,false/省略-jpa sql。
混合自定义的功能:repository增加继承新建接口A;新建类RepositoryImpl实现A,内部使用entityManager查询(JPA实现,@PesistenceContext);注入查询。标记RepositoryImpl为repository实现类.

第12章 使用NoSQL数据库

NoSQL,not only sql;类型:kv键值、列族、文档型、图形。
12.1 使用MongoDB持久化文档数据
对比elasticsearch,index-type-record。
@EnableMongoRepository启用Spring Data MongoDB;配置MongoFactoryBean/MongoClient、MongoTemplate;注入查询(将MongoTemplate注入为其实现的接口MongoOperations)。
对象-文档映射注解:@Document、@Id、@Field、@DbRef(标记属性为引用)、@Version(标记属性为版本);除瞬态属性外,其余属性均会持久化,默认文档域名称为属性名。
Spring Data MongoDB,继承MongoRepository,继承CRUD方法;创建自定义方法、指定查询(@Query,接受JSON查询),混合自定义功能(Impl混入)。类似JPA。
12.2 使用Neo4j操作图数据
文档型数据库将数据存储到粗粒度文档中,图数据库将数据存储到细粒度的节点中,节点间通过关联建立关系。
@EnableNeo4jRepositories启用Spring Data Neo4j;配置GraphDatabaseService、指定模型包;注入查询(注入为Neo4jOperations)。
映射注解。
其余类似JPA。
12.3 使用Redis操作key-value数据
配置连接工厂、RedisTemplate/StringRedisTemplate;操作数据。
配置RedisTemplate时,按数据类型选用序列化器。

第13章 缓存数据

Spring将缓存实现为一个切面。
13.1 启用对缓存的支持
Spring对缓存的支持方式:注解驱动的缓存、XML声明的缓存。
注解驱动的缓存:@EnableCaching/@CacheEvict启用缓存;配置CacheManager bean。
缓存规则注解:@Cacheable,@CachePut,@CacheEvict,@Caching

第14章 保护方法应用

14.1 使用注解保护方法
@EnableGlobalMethodSecurity,启用基于注解的方法安全性。设置对应属性为true。
@Secured、@RolesAllowed;基于用户权限,设置权限组。
@PreAuthorize/@PostAuthorize、@PreFilter/@PostFilter;通过SpEL表达式保护方法。

第4部分 Spring集成

第16章 使用Spring MVC创建REST API

@ResponseBody、@RestController,声明
ContentNegotiatingViewResolver内容协商解析器、消息转换器、自定义返回。
@RequestBody,转换查询参数为对象
@RequestMapping,produces/consumes属性,限定accept/content-type。

第20章 使用JMX管理Spring Bean

JMX:Java Management Extensions;java扩展管理
MBean:managed bean;暴露出特定方法的java bean。
启动jconsole,命令行运行:jconsole
20.1 将Spring bean导出为MBean
配置MBean服务器,xml-context:mbean-server,java配置MBeanServerFactoryBean bean。
配置MBeanExporter bean。setBeans(Map<String,Object> beans)。
@ManagedResource、@ManagedAttribute、@ManagedOperation;@ManagedAttribute会把setter方法对应属性变为托管属性。
处理MBean冲突:mbe.setRegistrationPolicy();

  • RegistrationPolicy.FAIL_ON_EXISTING;冲突则失败,默认
  • RegistrationPolicy.IGNORE_EXISTING;忽略冲突,不注册新MBean
  • RegistrationPolicy.REPLACING_EXISTING;覆盖
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值