Spring
spring简介
spring是一个开源的、非侵入式的、“一站式”的轻量级框架,它大大简化了Java企业级开发。
spring框架是由20个功能模块组成。这些模块被分为六个部分、分别是Core、Container、DataAccess/Antegration、Wed、AOP、Instrumentation和Test
spring优势和核心功能
-
优势
-
非侵入式编程
不需要继续类,不需要实现接口
-
支持JavaEE三层开发
- 数据库:支持mybaits,hibernate,封装jdbc
- 业务逻辑层:ioc,aop
- 表现层:对页面框架有支持,springmvc,struct2
-
-
spring核心功能:
-
IoC:控制反转:将new对象的权利交给了xml
DI:依赖注入
-
AOP:面向切面编程
在不改变以前代码的流程下,加入一段代码
-
Spring体系结构图
Spring IoC
Spring IoC(Inversion of Control):控制反转。就是将new对象的权利交给了Spring容器。其意义是用来降低程序代码之间的耦合度。
搭建spring ioc的框架
-
导入jar
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>5.1.9.RELEASE</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework/spring-context --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.1.9.RELEASE</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework/spring-core --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>5.1.9.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId> <version>5.1.9.RELEASE</version> </dependency> <!-- https://mvnrepository.com/artifact/commons-logging/commons-logging --> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.1.1</version> </dependency> <!-- https://mvnrepository.com/artifact/log4j/log4j --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>
-
配置文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="zhang" class="pojo.Greeting"> <property name="person" value="张嘎子"></property> <property name="words" ref=""></property> </bean> </beans>
- id:表示定义的Bean实例的名称
- class:放实例类的全映射路径或别名
- name:是属性名
- value:是给属性赋值
- ref:是个属性的引用bean id
-
测试
pplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml"); PetStoreService service = context.getBean("zhang"); List<String> userList = service.getUsernameList();
Spring AOP
AOP(Aspect Oriented Programming):面相切面编程。简单来说就是在不改变原程序的基础上为代码添加新的共能,对代码进行增强处理。
Spring AOP并不是一段完整的AOP理念,只是用了AOP的思想。延续了AOP里面的注解。
Spring AOP的基本概念
- 切面(Aspect):一个模块化的横切逻辑,可能会横切多个对象。
- 连接点(Join Point):程序执行中的某个具体的执行点。
- 增强处理(Advice):切面在某个特定连接点。
- 切入点(Pointcut)对连接点的特征进行描述。
- 目标对象(Target object):被一个或多个切面增强的对象。
- AOP代理(AOP proxy):由AOP框架所创建的对象,实现执行增强处理方法等功能。
- 织入(Weaving):将增强处理连接到应用程序中的类型或对象上的过程
- 增强处理类型:
- 前置增强
- 后置增强
- 最终增强
- 异常增强
- 循环增强
Spring AOP的增强类型
-
前置增强:在方法前面插入的增强处理为前置增强。
-
后置增强:在方法正常退出后面插入的增强处理为后置增强。
-
最终增强:在方法不管正常或异常退出都会插入的增强处理为最终增强。
-
异常增强:在方法异常退出后面插入的增强处理为前置增强。
-
循环增强:可以为方法提供前置增强、后置增强、异常增强、最终增强。它的方法是由循环增强执行的。
-
增强的配置代码:
<!-- 增强方法的new对象 --> <bean id="theLogger" class="aop.UserBizLogger"></bean> <aop:config> <!-- 匹配要增强的方法(* biz..*.*(..)) 表示biz下面使用的方法 --> <aop:pointcut id="pointcut" expression="execution(* biz..*.*(..))"/> <aop:aspect ref="theLogger"> <!-- 前置增强 method="方法名"--> <aop:before method="before" pointcut-ref="pointcut"></aop:before> <!-- 后置增强 returning="放回值"--> <aop:after-returning method="afterReturning" pointcut-ref="pointcut" returning="result"></aop:after-returning> <!-- 异常增强 throwing="放回值"--> <aop:after-throwing method="aftreThrowing" pointcut-ref="pointcut" throwing="e"></aop:after-throwing> <!-- 最终增强 returning="放回值"--> <aop:after-returning method="afterReturning" pointcut-ref="pointcut" returning="result"></aop:after-returning> </aop:aspect> </aop:config>
-
编写增强类:
-
前置增强方法:可以显示入参
public void before(JoinPoint jp){ System.out.println("调用"+jp.getTarget()+"的"+jp.getSignature().getName()+"方法。方法入参:"+ Arrays.toString(jp.getArgs())); }
-
后置增强方法:可以返回一个Object的参数
public void afterReturning(JoinPoint jp , Object result){ System.out.println("调用"+jp.getTarget()+"的"+jp.getSignature().getName()+"方法。方法返回值:"+result); }
-
异常增强方法:可以放回一个异常参数
public void aftreThrowing(JoinPoint jp , RuntimeException e){ System.out.println(jp.getSignature().getName()+"方法发生异常:"+e); }
-
最终增强方法:没有返回值
public void afterLogger(JoinPoint jp){ System.out.println(jp.getSignature().getName()+"方法结束执行 "); }
-
循环增强方法:
必须由Object返回值,jp.proceed();是真正的调用方法
public Object aroudLogger(ProceedingJoinPoint jp) throws Throwable{ System.out.println("调用"+jp.getTarget()+"的"+jp.getSignature().getName()+"方法。方法入参:"+ Arrays.toString(jp.getArgs())); try { Object result = jp.proceed(); System.out.println("调用"+jp.getTarget()+"的"+jp.getSignature().getName()+"方法。方法返回值:"+result); return result; }catch (Throwable e){ System.out.println(jp.getSignature().getName()+"方法发生异常的:"+e); throw e; }finally { System.out.println(jp.getSignature().getName()+"方法结束执行"); } }
-
Spring Mybatis 整合
导入jar架包
<!-- mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.1</version>
</dependency>
<!-- commons-dbcp2 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>2.7.0</version>
</dependency>
<!-- commons-pool2 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.7.0</version>
</dependency>
<!-- spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.1.7.RELEASE</version>
</dependency>
<!--spring-tx -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.1.7.RELEASE</version>
</dependency>
修改Spring xml文件
<!-- 配置数据源-->
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver" />
<property name="url">
<!-- 千万注意,这里不能换行 -->
<value><![CDATA[jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8]]></value>
</property>
<property name="username" value="root" />
<property name="password" value="root" />
</bean>
<!-- 引入mybatis的配置文件-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.mapper" />
</bean>
<bean id="userService" class="com.service.impl.UserServiceImpl">
<property name="userMapper" ref="userMapper" />
</bean>
<bean class="com.controller.UserController" id="userController">
<property name="userService" ref="userService" />
</bean>
spring注解
以下代码可以通过注解定义一个名为orderBiz的Bean,@Component(“orderBiz”)的作用在xml配置文件中编写
<bean id="orderBiz" class="biz.impl.orderBiz.impln>
@Component("orderBiz")
public class OrderBizImpl implements OrderBiz {
@Autowired
private OrderMapper orderMapper;
@Override
public List<Order> slelctList() {
return orderMapper.slelctList();
}
}
-
@Repository:用于标注dao类
-
@Service:用于标注控制类
-
@Controller:用于标注控制类。
java@Component(“orderBiz”)
public class OrderBizImpl implements OrderBiz {
@Autowired
private OrderMapper orderMapper;
@Override
public List slelctList() {
return orderMapper.slelctList();
}
}
1. @Repository:用于标注dao类
2. @Service:用于标注控制类
3. @Controller:用于标注控制类。
4. @Component:通用注解