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 ...
随机推荐
- bootstrap-select,selectpicker 用法详细:通过官方文档翻译
用过selectpicker的都说好~但是网上中文的教程又找不到比较完整的用法,于是去官网看了下 顺便弄过来翻译一下: 选项可以通过数据属性或JavaScript传递.对于数据属性,附加选项名称dat ...
- python初步学习-python模块之 logging
logging 许多应用程序中都会有日志模块,用于记录系统在运行过程中的一些关键信息,以便于对系统的运行状况进行跟踪.在python中,我们不需要第三方的日志组件,python为我们提供了简单易用.且 ...
- c语言学习笔记.数组.
数组: 可以存储一个固定大小的相同类型元素的顺序集合,比如int类型的数组.float类型的数组,里面存放的数据称为“元素”. 所有的数组都是由连续的内存位置组成.最低的地址对应第一个元素,最高的地址 ...
- 一文掌握关于Java数据结构所有知识点(欢迎一起完善)
在我们学习Java的时候,很多人会面临我不知道继续学什么或者面试会问什么的尴尬情况(我本人之前就很迷茫).所以,我决定通过这个开源平台来帮助一些有需要的人,通过下面的内容,你会掌握系统的Java学习以 ...
- JAVA 之 Tomcat知识框架【转】
一.Tomcat服务器(很熟悉) 1.Web开发概述 javaSE: javaEE:13种 javaME: JavaEE规范: 13种技术的总称.Servlet/Jsp JDBC JNDI JTA.. ...
- 庆祝团队合著的《自主实现SDN虚拟网络与企业私有云》终于得以出版 --- 本人负责分布式存储部分的编写
https://item.jd.com/12154254.html 京东购买地址
- linux shell 一些命令
https://stackoverflow.com/questions/918886/how-do-i-split-a-string-on-a-delimiter-in-bash wc: https: ...
- 洛谷P2097 资料分发1 题解
题目传送门 这道题竟然是橙色的: 因为可以用并查集来做,当然您用dfs也可以,不过应该要加优化. 一开始就把读入的合并起来,最后逐个查找就好啦... #include<bits/stdc++.h ...
- **CodeIgniter通过hook的方式实现简单的权限控制
根据自己的实际情况,需要两个文件,一个是权限控制类,Acl,另外一个是权限配置的文件acl.php放在了config这个目录下. Acl这个类放在了application/hook/acl.php.通 ...
- java总结(二)(运算符)
算数和赋值运算符 1.变量类型溢出时候,会直接取反:出现x>x+1 2.知道a++和++a 3.知道a/0错误 a/0.0无穷大 字符串 1.知道栈区.堆区和方法区 2.知道new String ...