spring核心及常用技术
一、核心内容
1、依赖注入(控制反转)
1)什么是依赖注入
spring将实例的创建交给spring容器(BeanFactory或ApplicationContext)管理,当实例创建后通过设值或构造注入的方式将实例赋值给调用程序的成员变量。对程序而言由原来的主动创建实例到被动被赋值实现实例化,这一过程称为控制反转;而对于spring容器而言,将被依赖对象赋值给调用者的成员变量,给调用者注入了它依赖的实例,因此这种方式又被称作依赖注入。
2)bean注入方式(设值注入、构造注入)
区别注入时机不同:设值注入通过无参构造器创建bean实例,然后调用对应的setter方法注入依赖关系;构造注入则直接调用有参构造器,当bean实例创建完成后已完成依赖关系的注入。
注意:对于依赖关系固定的注入,尽量采用构造注入,这样对于组件的调用者而言,组件内部依赖关系完全透明,更符合高内聚原则;其它依赖关系注入则采用设置注入,更直观。
3)BeanFactory和ApplicationContext的区别
实例化容器中bean的时机不同,BeanFactory等到程序需要bean实例时才创建;ApplicationContext会在容器创建时预初始化容器中所有的singleton bean,因此实例化过程时间和内存开销大,但可再容器时初始化阶段检验出配置错误。
4)spring容器作用域
a、ApplicationContext容器的作用域有五种,通过scope属性指定
singleton:单例模式,在整个spring ioc容器中,bean将只生成一个实例
prototype:每次通过容器的geBean()方法获取bean时,都将产生一个新的实例
request:对于一次HTTP请求,bean将生成一个新的实例。web应用中才有效。
session:对于一次HTTP会话,bean只生成一个实例。web应用中才有效。
global session:每个全局的HTTP session对应一个bean实例。web应用中才有效。
b、测试
spring-mvc.xml文件
<bean id="user1" class="com.example.entity.User"></bean>
<bean id="user2" class="com.example.entity.User" scope="prototype"></bean>
java代码
@Controller
@RequestMapping(value = "/user")
public class UserCotroller {
@Autowired
private ApplicationContext applicationContext;
@RequestMapping(value = "/loginView")
public String loginView() {
System.out.println(applicationContext.getBean("user1") == applicationContext.getBean("user1"));//true
System.out.println(applicationContext.getBean("user2") == applicationContext.getBean("user2"));//false
return "login";
}
}
2、spring aop
AOP(Aspect Orient Programming)是对OOP(Object-Oriented Programing,面向对象编程)的一种补充,解决java语言中存在的交叉关注点的问题。所谓交叉关注点问题就是解决为分散的对象引入公共的行为,如日志输出、权限判断、事务管理、缓存等共性操作。这些操作如果采用OOP设计,会产生大量冗余代码、不利于系统维护,AOP则利用aspect(横切)技术很好的解决了这些问题,AOP不与特定的代码耦合,而是通过特定切入点实现业务的增强处理。
1)AOP术语:
切面(Aspect):用于组织多个advice(增强处理)
连接点(Joinpoint):程序之执行过程中明确的点,如方法的调用或异常的抛出
增强处理(Advice):特定切入点执行的增强处理,有before、around、after等。
切入点(Pointcut):可以插入增强处理的连接点。
2)测试
java代码
public class AspectTest {
public void log(JoinPoint jb, Object obj) {
System.out.println("AfterReturning [" + " class name:" + jb.getTarget()+ ", method name:" + jb.getSignature().getName() + ", back vlue:" + obj + "]");
}
}
spring-mvc.xml文件
<bean id="aspectTest" class="com.example.spect.AspectTest"></bean>
<aop:config>
<aop:aspect id="aspectTest" ref="aspectTest" order="2">
<aop:after-returning method="log" pointcut="execution(* com.example.controller.*.*(..))" returning="obj"></aop:after-returning>
</aop:aspect>
</aop:config>
pom.xml文件(仅aop所需依赖)
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.3.6.RELEASE</version>
</dependency> <dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.8.10</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.10</version>
</dependency>
运行结果
AfterReturning [ class name:com.example.controller.UserCotroller@447f8cce, method name:loginView, back vlue:login]
二、具体搭建
1、idea创建web项目
2、springmvc实现页面跳转
web.xml中添加
<!-- Spring MVC servlet -->
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
创建spring-mvc.xml文件resource或WEB-INF目录下
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> <!-- 自动扫描该包,使SpringMVC认为包下用了@controller注解的类是控制器 -->
<context:component-scan base-package="com.example.*"/> <!-- 定义跳转的文件的前后缀 ,视图模式配置-->
<bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
<property name="redirectHttp10Compatible" value="false"/>
</bean>
</beans>
pom.xml中添加依赖
<!--spring-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${org.springframework-version}</version>
</dependency> <!--servlet-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
3、常见错误跳转页面
web.xml中添加如下代码
<!-- 出错页面定义 -->
<error-page>
<exception-type>java.lang.Throwable</exception-type>
<location>/WEB-INF/views/500.jsp</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/WEB-INF/views/404.jsp</location>
</error-page>
4、springmvc国际化
spring-mvc.xml中添加
<!--国际化-->
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basenames">
<list>
<value>message.message</value>
</list>
</property>
<property name="defaultEncoding" value="utf-8"/>
</bean>
创建message_en_US.properties,message_zh_CN.properties文件再resource目录下
message_zh_CN.properties
hello=hello
message_zh_CN.properties
hello=你好
后台获取代码
@Autowired
private ResourceBundleMessageSource messageSource; @RequestMapping(value = "/loginView")
public String loginView() {
System.out.println(messageSource.getMessage("hello", null, null));
return "login";
}
页面获取
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<html>
<head>
<title>test</title>
</head>
<body>
<h1><spring:message code="hello"/></h1>
</body>
</html>
5、日志处理
6、ApplicationContext的事件机制
对ApplicationContext容器中的事件进行监听。
Spring中ApplicationContext的事件机制
7、spring事务管理
8、spring定时器
9、spring拦截器
8、常见面试题
spring核心及常用技术的更多相关文章
- hibernate核心及常用技术
一.hibernate介绍 1.hibernate概述 hibernate是轻量级Java EE持久层解决方案,管理java类到数据库表的映射(ORM:对象关系型数据映射),并提供数据查询获取的方法. ...
- Spring 5.x 、Spring Boot 2.x 、Spring Cloud 与常用技术栈整合
项目 GitHub 地址:https://github.com/heibaiying/spring-samples-for-all 版本说明: Spring: 5.1.3.RELEASE Spring ...
- 框架应用:Spring framework (一) - IoC技术
IoC概念以及目标 IoC就是让原本你自己管理的对象交由容器来进行管理,其主要的目的是松耦合. IoC发展史 既然IoC的目标是为了松耦合,那它怎么做到的? 最后目标:降低对象之间的耦合度,IoC技术 ...
- Spring MVC & Boot & Cloud 技术教程汇总(长期更新)
昨天我们发布了Java成神之路上的知识汇总,今天继续. Java成神之路技术整理(长期更新) 以下是Java技术栈微信公众号发布的关于 Spring/ Spring MVC/ Spring Boot/ ...
- Spring核心AOP(面向切面编程)总结
(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/75208354冷血之心的博客) 1.AOP概念: 面向切面编程,指扩 ...
- 2019年Spring核心知识点整理,看看你掌握了多少?
前言 如今做Java尤其是web几乎是避免不了和Spring打交道了,但是Spring是这样的大而全,新鲜名词不断产生,学起来给人一种凌乱的感觉,在这里总结一下,理顺头绪. Spring 概述 Spr ...
- Spring 核心功能演示
Spring 核心功能演示 Spring Framework 简称 Spring,是 Java 开发中最常用的框架,地位仅次于 Java API,就连近几年比较流行的微服务框架 SpringBoot, ...
- Spring框架系列(3) - 深入浅出Spring核心之控制反转(IOC)
在Spring基础 - Spring简单例子引入Spring的核心中向你展示了IoC的基础含义,同时以此发散了一些IoC相关知识点; 本节将在此基础上进一步解读IOC的含义以及IOC的使用方式.@pd ...
- Spring框架系列(4) - 深入浅出Spring核心之面向切面编程(AOP)
在Spring基础 - Spring简单例子引入Spring的核心中向你展示了AOP的基础含义,同时以此发散了一些AOP相关知识点; 本节将在此基础上进一步解读AOP的含义以及AOP的使用方式.@pd ...
随机推荐
- 【leetcode 简单】第三十二题 买卖股票的最佳时机Ⅱ
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你可以尽可能地完成更多的交易(多次买卖一支股票). 注意:你不能同时参与多笔交易(你必须在再次 ...
- 强连通图(最多加入几条边使得图仍为非强连通图)G - Strongly connected HDU - 4635
题目链接:https://cn.vjudge.net/contest/67418#problem/G 具体思路:首先用tarjan缩点,这个时候就会有很多个缩点,然后再选取一个含有点数最少,并且当前这 ...
- 二进制、十进制、十六进制(python)
int(“x”,base=2/8/16)是把x都转换成十进制 二进制: 1111=1*2的3次方+1*2的2次方+1*2的1次方+1*2的0次方 =8+4+2+1=15 1000=1*2的3次方+0 ...
- Android 反编译神器jadx的使用
一.前言 今天介绍一个非常好用的反编译的工具 jadx .jadx 的功能非常的强大,对我而言,基本上满足日常反编译需求. jadx 优点: 图形化的界面. 拖拽式的操作. 反编译输出 Java 代码 ...
- C# 开发(创蓝253)手机短信验证码接口
创蓝253: https://www.253.com/ #region 获取手机验证码(创蓝253) /// <summary> /// 获取手机验证码(创蓝253) /// </s ...
- PHP 利用nginx的X-sendfile控制下载,提高下载效率
https://blog.csdn.net/qq_34839657/article/details/52812885 https://www.jianshu.com/p/bf5c387830b7 为了 ...
- 【转载】移动开发中的上下左右滑动插件jquery.swipe.js
原文地址http://blog.csdn.net/pvfhv/article/details/3449803/# 源码: (function($) { var old = $.fn.swipe; $. ...
- LightOJ - 1010 Knights in Chessboard(规律)
题目链接:https://vjudge.net/contest/28079#problem/B 题目大意:给你一个nxm的棋盘,问你最多可以放几个骑士让他们互相攻击不到.骑士攻击方式如下图: 解题思路 ...
- JavaWeb知识回顾-Servlet常用类、接口及其方法
今天主要把servlet的一些常用的类.接口和方法简单回顾一下. javax.servlet包 1.javax.servlet.Servlet接口 接口用于开发servlet,所有的servlet都要 ...
- [你必须知道的.NET]第二十四回:认识元数据和IL(上)
发布日期:2009.02.24 作者:Anytao © 2009 Anytao.com ,Anytao原创作品,转贴请注明作者和出处. 说在,开篇之前 很早就有说说Metadata(元数据)和IL(中 ...