springmvc
spring ioc
mybatis
mybatis plus
hibernite
互联网项目,多ssm结构
ioc将对象的创建权利交给spring框架,底层实际上是使用反射实现的。降低程序的耦合度
创建一个空的maven项目
引入一些基本依赖
<dependencies>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-contextartifactId>
<version>5.0.2.RELEASEversion>
dependency>
<dependency>
<groupId>commons-logginggroupId>
<artifactId>commons-loggingartifactId>
<version>1.2version>
dependency>
<dependency>
<groupId>log4jgroupId>
<artifactId>log4jartifactId>
<version>1.2.12version>
dependency>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.12version>
<scope>testscope>
dependency>
dependencies>
准备实体类
// 创建一个接口
public interface UserService {
public void hello();
}
// 创建一个实体类
public class UserServiceImpl implements UserService {
@Override
public void hello() {
System.out.println("Hello, world!");
}
}
准备配置文件
<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
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="us" class="实体类的路径">bean>
beans>
在test中测试
// 常规方法
@Test
public void testUser() {
// TODO: write test cases for UserService
UserService userService = new UserServiceImpl();
userService.hello();
}
// 基于ioc容器管理的方法,ioc是一个map key是对象的标识,value是ioc创建的对象
@Test
public void run1() {
// 创建spring ioc工厂
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
// 获取bean
UserService userService = (UserService) ac.getBean("us");
userService.hello();
}
上面就是一个关于ioc容器的示例
ApplicationContext接口,这个工厂接口,使用这个接口就可以获得相应的Bean对象,该对象下有两个实现类
默认是无参的构造方法
<bean id="us" class="实体类的路径">bean>
静态工厂实例化方法(好处是可以自己编写业务逻辑)
准备一个静态工厂类
public class StaticFactory {
public static UserService createUser() {
// 编写业务逻辑
// ......
return new UserServiceImpl();
}
}
在xml配置文件中使用
<bean id="us1" class="com.qc.util.StaticFactory" factory-method="createUser">bean>
实例化工厂实例化方式
准备一个可以实例化的类
public class DFactory {
public UserService createUser() {
// 编写业务逻辑
return new UserServiceImpl();
}
}
在xml配置文件中使用
<bean id="factory" class="com.qc.util.DFactory">bean>
<bean id="us2" factory-bean="factory" factory-method="createUser">bean>
是一种编辑的范式,是OOP的延续,也是Spring框架中函数编程的一种衍生范式,利用AOP可以对业务的各个部分进行隔离,从而似的业务逻辑各部分之间的耦合度降低,提高了程序的重用性,同时提高了开发的效率,AOP采用横向抽取机制,取代了传统纵向继承体系。
导入坐标依赖
aopalliance
aopalliance
1.0
org.springframework
spring-aspects
5.0.2.RELEASE
org.aspectj
aspectjweaver
1.8.3
编写spirng配置文件中AOP的配置部分
import org.aspectj.lang.ProceedingJoinPoint;
public class MyAspect {
// 自定义切面类 = 切入点+通知
//通知
public void log1() {
System.out.println("前置增强的");
}
public void log2() {
System.out.println("后置增强的");
}
public void log3() {
System.out.println("异常增强的");
}
public void log4() {
System.out.println("最终增强的");
}
public void aroundLog(ProceedingJoinPoint point) {
try {
log1();
point.proceed(); // 目标方法调用
log2();
} catch (Throwable e) {
e.printStackTrace();
log3();
} finally {
log4();
}
}
}
注意环绕通知使用的接口
通知类型
切入点表达式
因此比较通用的表达式:
execution( com.qc.*.Service.save(…))
给切面添加@Aspect,编写增强的方法,使用通知类型注解声明
<context:component-scan base-package="com.qc"/>
<aop:aspectj-autoproxy/>
@Aspect
@Component
public class MyAspect {
// 自定义切面类 = 切入点+通知
//通知
@Before("execution(* com.qc.*.*.*ServiceImpl.save(..))")
public void log1() {
System.out.println("前置增强的");
}
@AfterReturning("execution(* com.qc.*.*.*ServiceImpl.save*(..))")
public void log2() {
System.out.println("后置增强的");
}
@AfterThrowing("execution(* com.qc.*.*.*ServiceImpl.save*(..))")
public void log3() {
System.out.println("异常增强的");
}
@After("execution(* com.qc.*.*.*ServiceImpl.save*(..))")
public void log4() {
System.out.println("最终增强的");
}
@Around("execution(* com.qc.*.*.*ServiceImpl.save*(..))")
public void aroundLog(ProceedingJoinPoint point) {
try {
log1();
point.proceed(); // 目标方法调用
log2();
} catch (Throwable e) {
e.printStackTrace();
log3();
} finally {
log4();
}
}
}
在每个方法上使用注解进行配置,和配置文件类似
通知类型注解:
注意:在配置文件中开启自动代理
@EnableAspectJAutoProxy 开启自动代理
依赖注入:在spring框架负责创建bean对象时,动态的将对象注入到其他的bean对象中
声明变量并在需要依赖注入的地方设置set方法
在xml文件中配置该变量的值
<bean id="us" class="com.qc.service.impl.UserServiceImpl">
<property name="userDao" ref="">property>
<property name="name" value="">property>
bean>
参数说明:如果property中的是一个简单类型(基本类型和字符串),那么就使用value,否则就使用ref
在需要的地方添加构造方法
在配置文件中使用带参数的构造方法传参
<bean id="userDao" class="com.qc.dao.impl.UserDaoImpl">bean>
<bean id="us" class="com.qc.service.impl.UserServiceImpl">
<constructor-arg name="userDao" ref="userDao">constructor-arg>
bean>
其他类型的参数传参
准备一个java类
public class CollectionBean {
private String[] strs;
private List<String> list;
private Map<String, String> map;
private Properties properties;
public Properties getProperties() {
return properties;
}
public void setProperties(Properties properties) {
this.properties = properties;
}
public Map<String, String> getMap() {
return map;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
public String[] getStrs() {
return strs;
}
public List<String> getList() {
return list;
}
public void setList(List<String> list) {
this.list = list;
}
public CollectionBean() {
}
public void setStrs(String[] strs) {
this.strs = strs;
}
public CollectionBean(String[] strs) {
this.strs = strs;
}
}
不可变数组
<bean id="co" class="com.qc.service.CollectionBean">
<property name="strs">
<array>
<value>小美value>
<value>小张value>
<value>小王value>
array>
property>
bean>
可变集合
<bean id="co" class="com.qc.service.CollectionBean">
<property name="list">
<list>
<value>张三value>
<value>李四value>
<value>王五value>
list>
property>
bean>
map集合
<bean id="co" class="com.qc.service.CollectionBean">
<property name="map">
<map>
<entry key="name" value="zhangsan">entry>
<entry key="age" value="18">entry>
map>
property>
bean>
其他类型
<bean id="co" class="com.qc.service.CollectionBean">
<property name="properties">
<props>
<prop key="username">zhangsanprop>
<prop key="password">1234prop>
props>
property>
bean>
在配置文件中使用
<import resource="applicationContext.xml">import>
创建工厂时直接加载多个配置文件
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml","applicationContext1.xml");
zhangsan
1234
```
在配置文件中使用
<import resource="applicationContext.xml">import>
创建工厂时直接加载多个配置文件
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml","applicationContext1.xml");