**概要:**说起Spring,作为java开发程序员必备技能,掌握Spring常用开发技术点是必须的。包含DI IOC AOP思想。Spring全家桶(boot cloud security等).
Spring 框架是一个开源的 Java 平台,它最初是由 Rod Johnson 编写的, 并且于 2003 年 6 月首次在 Apache 2.0 许可下发布。 Spring 是轻量级的框架,其基础版本只有 2 MB 左右的大小。 Spring 框架的核心特性是可以用于开发任何 Java 应用程序, 但是在 Java EE 平台上构建 web 应用程序是需要扩展的。 Spring 框架的目标是使 J2EE 开发变得更容易使用, 通过启用基于 POJO 编程模型来促进良好的编程实践。
**核心点
简介:**
1,控制反转(DI):
本质上底层实现机制用的就是java的反射,依赖注入仅仅是控制反转的一个具体的例子。当编写一个复杂的 Java 应用程序时,应用程序类应该尽可能的独立于其他的 Java 类来增加这些类可重用可能性,当进行单元测试时,可以使它们独立于其他类进行测试。依赖注入(或者有时被称为配线)有助于将这些类粘合在一起,并且在同一时间让它们保持独立。
2.面向切面编程(AOP):
在面向切面之前介绍下面向接口,如果两个类之间要想建立起关联信息的话,就必须在一个类中持有别的类的引用这种方式,代码之间的耦合性比较强。面向接口的话就是:A和B之间建立联系,将B定义为接口,C为B的实现类,将A与C之间建立联系。
AOP核心理念就是,降低类与类之间的耦合,提升系统的源码重用性,在不增加代码的基础之上完成功能的纵向添加。比如我们常用的日志,安全监控,事务以及缓存等机制都可以使用AOP来进行解决。
Spring 核心组件:
Spring框架的好处:
(1)Spring 可以使开发人员使用 POJOs 开发企业级的应用程序。只使用 POJOs 的好处是你不需要一个 EJB 容器产品,比如一个应用程序服务器,但是你可以选择使用一个健壮的 servlet 容器,比如 Tomcat 或者一些商业产品。
(2)支持MVC开发模式,视图与实际的业务逻辑进行相分离,
模型(Model)封装了应用程序数据,通常它们将由POJO类组成。 视图(View)负责渲染模型数据,一般来说它生成客户端浏览器可以解释HTML输出。 控制器(Controller)负责处理用户请求并构建适当的模型,并将其传递给视图进行渲染。
(3)Spring 对JavaEE开发中非常难用的一些API(JDBC、JavaMail、远程调用等),都提供了封装,使这些API应用难度大大降低。
(4)Spring提供了一致的事务管理接口,可向下扩展到(使用一个单一的数据库,例如)本地事务并扩展到全局事务(例如,使用 JTA)。
(5)轻量级IOC容器。
Spring框架的缺点:
配置繁琐,而且整体项目工程比较重。总结性的来讲Spring底层实现很繁琐但也很精妙。个人理解就是在bean管理还有运用上,配置比较繁琐。因为使用框架的初衷就是简化开发,相比繁重的配置更推荐使用微服务框架。
Spring机制与实现框架图:
Spring注解驱动式开发常用注解:
关于注解驱动式开发结合实际案例进行再一步详细说明;
传统SSM框架集成配置:
说起框架的配置,更加习惯将Spring看做一个容器,也就是说需要什么功能,进行配置使用就OK。那么搭框架真的很难吗?下面跟随小编一起看一下:
(1)利用Maven创建动态web项目(以eclipse为例);IDEA可以直接创建Spring的项目(boot 直接配置pom文件加载依赖);
(2)项目目录结构
├──pom.xml
├──main
| ├──java
| | └──com
| | └──web
| | ├── core
| | | ├── controller //控制器包
| | | ├── entity //POJO包
| | | ├── mapper //Mapper接口包
| | | ├── service //Service接口包
| | | └── serviceImpl //service实现类包
| | └──util //工具包
| ├── resources //资源文件夹(配置文件)
| | ├──applicationContext.xml //Spring配置文件
| | ├──dbconfig.properties //数据库配置文件
| | ├──log4j.properties //log4j配置文件
| | ├──mybatis-config.xml //mybatis配置文件
| | ├──spring-mvc.xml //springMvc配置文件
| | ├──spring-mybatis.xml //spring-mybatis整合配置
| | └── mapping //mapper.xml文件夹
| | └── StudentMapper.xml
| └── webapp ///web应用部署根目录
| ├──login.html //登录页
| ├──pages //jsp文件将爱
| | └── studentList.jsp
| ├──static //静态资源文件夹
| | ├──css
| | | └── login.css
| | ├──images
| | | ├──login-img.png
| | | └── login_logo.png
| | └── js
| | └── JQuery.js
| └── WEB-INF
| └── web.xml
└──test
├── java
├── resources
(3)引入相关jar包依赖;
(4)配置整合:在applicationContext.xml进行配置组件bean之间的关系,根据项目的需要配置也可以进行拆分,为方便管理一般会进行分几个xml文件进行分开配置。进行统一管理。
<context:property-placeholder location="classpath:db.properties"/>
<!-- 1、数据源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
....
</bean>
<!-- 2、配置mybatis交给spring来管理 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!-- 加载mybatis的全局配置文件 -->
<property name="configLocation" value="resouces/:spring-mybatis.xml" />
</bean>
<!--2.1 告诉Spring mybatis的mapper文件在哪,如果是注解可以不用-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
<property name="basePackage" value="com.qd.userprofile.dao" />
</bean>
<!-- 3、事务 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--开启事务注解-->
<tx:annotation-driven transaction-manager="transactionManager"/>
配置Mybatis:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<setting name="cacheEnabled" value="true"/>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false" />
<setting name="useColumnLabel" value="true"/>
<setting name="useGeneratedKeys" value="true"/>
<setting name="defaultStatementTimeout" value="25"/>
<setting name="defaultFetchSize" value="100"/>
<setting name="mapUnderscoreToCamelCase" value="true"/>
<setting name="localCacheScope" value="SESSION"/>
<setting name="jdbcTypeForNull" value="NULL"/>
<setting name="logImpl" value="LOG4J2" />
</settings>
</configuration>
配置SpringMVC.xml
<?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:p="http://www.springframework.org/schema/p"
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/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 扫描controller -->
<context:component-scan base-package="com.controller" />
<!-- Spring 来扫描指定包下的类,并注册被@Component,@Controller,@Service,@Repository等注解标记的组件 -->
<mvc:annotation-driven />
<!-- 配置SpringMVC的视图解析器-->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>
配置dbconfig.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test?characterEncoding=utf-8
jdbc.username=root
jdbc.password=root
思考问题?为什么用这种配置底层是怎么做的?是hash?线程是否安全?随便一想有答案的大佬可以解答下 不胜感激。
配置Log4J
(log4j.properties)
log4j.rootLogger=error,CONSOLE,A
log4j.addivity.org.apache=false
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Threshold=error
log4j.appender.CONSOLE.layout.ConversionPattern=%d{yyyy-MM-dd HH\:mm\:ss} -%-4r [%t] %-5p %x - %m%n
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.Encoding=gbk
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.A=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A.File=${catalina.home}/logs/FH_log/PurePro_
log4j.appender.A.DatePattern=yyyy-MM-dd'.log'
log4j.appender.A.layout=org.apache.log4j.PatternLayout
log4j.appender.A.layout.ConversionPattern=[FH_sys] %d{yyyy-MM-dd HH\:mm\:ss} %5p %c{1}\:%L \: %m%n
Log4j.xml配置
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd"> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> <!-- Appenders --> <appender name="console" class="org.apache.log4j.ConsoleAppender"> <param name="Target" value="System.out" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d{yyyy HH:mm:ss} %-5p %c - %m%n" /> </layout> </appender> <!-- Application Loggers --> <logger name="com"> <level value="error" /> </logger> <!-- 3rdparty Loggers --> <logger name="org.springframework.core"> <level value="error" /> </logger> <logger name="org.springframework.beans"> <level value="error" /> </logger> <logger name="org.springframework.context"> <level value="error" /> </logger> <logger name="org.springframework.web"> <level value="error" /> </logger> <logger name="org.springframework.jdbc"> <level value="error" /> </logger> <logger name="org.mybatis.spring"> <level value="error" /> </logger> <logger name="java.sql"> <level value="error" /> </logger> <!-- Root Logger --> <root> <priority value="error" /> <appender-ref ref="console" /> </root> </log4j:configuration>
根据项目需要还会配置Ehcache:
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="ehcache.xsd" updateCheck="false">
<!-- 磁盘保存路径 -->
<diskStore path="D:\44\ehcache" />
<defaultCache
maxElementsInMemory="1"
maxElementsOnDisk="10000000"
eternal="false"
overflowToDisk="true"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU">
</defaultCache>
</ehcache>
<!--
属性说明:
l diskStore:指定数据在磁盘中的存储位置。
l defaultCache:当借助CacheManager.add("demoCache")创建Cache时,EhCache便会采用<defalutCache/>指定的的管理策略
以下属性是必须的:
l maxElementsInMemory - 在内存中缓存的element的最大数目
l maxElementsOnDisk - 在磁盘上缓存的element的最大数目,若是0表示无穷大
l eternal - 设定缓存的elements是否永远不过期。如果为true,则缓存的数据始终有效,如果为false那么还要根据timeToIdleSeconds,timeToLiveSeconds判断
l overflowToDisk - 设定当内存缓存溢出的时候是否将过期的element缓存到磁盘上
以下属性是可选的:
l timeToIdleSeconds - 当缓存在EhCache中的数据前后两次访问的时间超过timeToIdleSeconds的属性取值时,这些数据便会删除,默认值是0,也就是可闲置时间无穷大
l timeToLiveSeconds - 缓存element的有效生命期,默认是0.,也就是element存活时间无穷大
diskSpoolBufferSizeMB 这个参数设置DiskStore(磁盘缓存)的缓存区大小.默认是30MB.每个Cache都应该有自己的一个缓冲区.
l diskPersistent - 在VM重启的时候是否启用磁盘保存EhCache中的数据,默认是false。
l diskExpiryThreadIntervalSeconds - 磁盘缓存的清理线程运行间隔,默认是120秒。每个120s,相应的线程会进行一次EhCache中数据的清理工作
l memoryStoreEvictionPolicy - 当内存缓存达到最大,有新的element加入的时候, 移除缓存中element的策略。默认是LRU(最近最少使用),可选的有LFU(最不常使用)和FIFO(先进先出)
-->