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 ...
随机推荐
- Count on a tree(SPOJ COT + 树上第k大 + 主席树 + LCA)
题目链接:https://www.spoj.com/problems/COT/en/ 题目: 题意: 给你一棵有n个节点的树,求节点u到节点v这条链上的第k大. 思路: 我们首先用dfs进行建题目给的 ...
- input复选框checkbox默认样式纯css修改
修改之前的样式 修改之后的样式 html <input type="checkbox" name="btn" id="btn1"&g ...
- Python3中的SocketServer
socket并不能多并发,只能支持一个用户,socketserver 简化了编写网络服务程序的任务,socketserver是socket的在封装.socketserver在python2中为Sock ...
- Python os.path.dirname(__file__) os.path.join(str,str)
Python os.path.dirname(__file__) Python os.path.join(str,str) (1).当"print os.path.dirname(__f ...
- javashop每次重新部署都要从新安装的问题
javashop每次重新部署都要从新安装的问题 发现一个问题就是用MyEclipse是部署不上的,用eclipse才行. 这个问题的关键在于javashop有好多文件都是动态生成的,好多配置文件也是在 ...
- PHP对象4: final 不允许重写方法或不允许继承类
final用在方法中,能继承方法, 不允许重写方法 final用在类声名中, 此类就不能继承 <?php class A{ final function say(){ say 'Ok<br ...
- 64.Minimum Path Sum---dp
题目链接:https://leetcode.com/problems/minimum-path-sum/description/ 题目大意:从左上到右下的路径中,找出路径和最小的路径(与62,63题相 ...
- ThoughtWorks代码挑战——FizzBuzzWhizz游戏 通用高速版(C/C++ & C#)
最早看到这个题目是从@ 程序媛想事儿(Alexia) 的 最难面试的IT公司之ThoughtWorks代码挑战——FizzBuzzWhizz游戏 开始的,然后这几天陆陆续续有N个小伙伴发表了自己的文章 ...
- GitHub vs GitLab:它们有什么区别?
查看原文GitLab vs. GitHub: How Are They Different? 两者都是基于web的Git repositories(仓库),拥有流水线型的web开发流程,它们为开发团队 ...
- Python股票信息抓取(二)
在一的基础上,想着把所有的折线图放在一个图中,然后图的结果如图所示: 不是略丑,是很丑~ 依然的单进程,只是将图标结果放在了一张图里 代码如下: #-*-coding:utf-8 -*- import ...