spring
管理对象
bean
id,name,class,
<!-- id:bean对象的id,唯一标识。一般是Bean对象的名称的首字母小写 class:bean对象的类路径 --> <bean id="userService" class="com.xxxx.service.UserService"></bean>
scoope:singleton(默认单例)
prototype(非单例的)
实例化对象三种方式:
构造器:
-
设置配置文件 spring.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" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="userService" class="com.xxxx.service.UserService"></bean> </beans>
\2. 获取实例化对象
ApplicationContext ac = new ClassPathXmlApplicationContext("spring.xml"); UserService userService = (UserService) ac.getBean("userService"); userService.test();
静态工厂
实例化工厂
注入id
set注入*
<?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:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<bean id="factory" class="com.yjxxt.factory.CarFactory2"></bean>
<bean id="car02" factory-bean="factory" factory-method="getCar"></bean>
<!--汽车-->
<bean id="car" class="com.yjxxt.factory.CarFactory" factory-method="getCar">
<constructor-arg value="QQ"></constructor-arg>
</bean>
<!--日期对象-->
<bean id="date" class="java.util.Date">
<property name="year" value="2010"></property>
</bean>
<!--静态工厂实例化-->
<bean id="stu" class="com.yjxxt.bean.Student">
<property name="sid" value="20211001"></property>
<property name="name" value="冯杰"></property>
<property name="age" value="18"></property>
<property name="score" value="78.8"></property>
<!--参考-->
<property name="birth" ref="date"></property>
<!--注入set集合-->
<property name="aset">
<set>
<value>吸烟</value>
<value>喝酒</value>
<value>烫头</value>
</set>
</property>
<!--注入list集合-->
<property name="klist">
<list>
<value>AAAA</value>
<value>BBBB</value>
<value>CCCC</value>
</list>
</property>
<!--注入map-->
<property name="map">
<map>
<entry key="6222212345678">
<value>中国银行业</value>
</entry>
<entry key="6222212345678">
<value>工商银行业</value>
</entry>
<entry key="6222212345678">
<value>建设银行业</value>
</entry>
</map>
</property>
<!--注入properties-->
<property name="properties">
<props>
<prop key="driver">com.mysql.jdbc.Driver</prop>
<prop key="url">jdbc:mysql:///java50?characterEncoding=utf-8</prop>
<prop key="username">root</prop>
<prop key="password">root</prop>
</props>
</property>
<!--注入数组-->
<property name="hobby">
<array>
<value>语文</value>
<value>数学</value>
<value>外语</value>
</array>
</property>
<!--注入car-->
<property name="myCar" ref="car02"></property>
</bean>
</beans>
构造器注入
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" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd"> <!--IOC通过构造器注入: 通过constructor-arg标签进行注入 name:属性名称 ref:指定bean标签的id属性值 --> <bean id="userDao" class="com.yjxxt.dao.UserDao" ></bean> <bean id="userService" class="com.yjxxt.service.UserService"> <constructor-arg name="userDao" ref="userDao"></constructor-arg> </bean> </beans>
静态工厂注入
实例化注入
p标签注入
自动装配
Auttowired:通过默认类型查找,效果:创建一个小驼峰规范的同名对象
resource:根据名称查找,未找到按照类型查找
开启自动化装配
xml手动实例化对象,context:annotation-config/开启自动化装配,
<?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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!--开启自动装配-->
<context:annotation-config/>
<!--实例化dao-->
<bean id="ud" class="com.yjxxt.dao.UserDao"></bean>
<bean id="roleDao" class="com.yjxxt.dao.RoleDao"></bean>
<!--实例化service-->
<bean id="us" class="com.yjxxt.service.UserService"></bean>
<!--**************-->
<bean id="sd" class="com.yjxxt.dao.StudentDao"></bean>
<bean id="td" class="com.yjxxt.dao.TeacherDao"></bean>
<bean id="as" class="com.yjxxt.service.AccountService"></bean>
</beans>
扫描开发
开启扫描,
<!--开启扫描-->
<context:component-scan base package="com.yjxxt"/>
注解
Dao层:
@Repository
Service层:
@Service
Controller层:
@Controller
任意类:
@Component
注:开发过程中建议按照指定规则声明注解
登录案例
aop
面向切面编程
作用:不改变原来代码的基础上,可以使目标方法增强
优势:
高内聚,低耦合
提高代码维护性
提高项目的扩展性
实现:
开启aop注解:
<!--开启扫描-->
<context:component-scan base-package="com.yjxxt"/>
<!--开启注解开发aop-->
<aop:aspectj-autoproxy/>
切面:
package com.yjxxt.aop;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
import java.util.Date;
@Component
@Aspect<--切面-->
public class LogerPage {
@Pointcut(value = "execution(* com.yjxxt.service.UserServiceImpl.*(..))")
public void cut(){
}
/**
* 前置通知
*/
@Before(value = "cut()")
public void before(){
System.out.println(new Date().toLocaleString()+"Before");
}
/**
* 最终通知
*/
// @After(value = "cut()")
// public void after(){
// System.out.println(new Date().toLocaleString()+"After");
// }
// @AfterReturning(value = "cut()")
// public void afterReturn(){
// System.out.println("afterReturn ....");
// }
//
//
// @AfterThrowing(value = "cut()",throwing="e")
// public void afterThrowing(Exception e){
// System.out.println(e.getCause()+"---->"+e.getMessage());
// System.out.println(new Date().toInstant());
// }
@Around(value = "cut()")
public Object around(ProceedingJoinPoint pjp){
//执行目标方法
Object obj = null;
try {
System.out.println("Before....");
obj = pjp.proceed();
System.out.println("After.....");
} catch (Throwable throwable) {
throwable.printStackTrace();
System.out.println("异常通知了");
}
System.out.println("通知一一下");
//返回结果
return obj;
}
}
底层实现
代理模式
代理模式在 Java 开发中是一种比较常见的设计模式。设计目的旨在为服务类与客户类之间插入其他功能,插入的功能对于调用者是透明的,起到伪装控制的作用。如租房的例子:房客、中介、房东。对应于代理模式中即:客户类、代理类 、委托类(被代理类)。
为某一个对象(委托类)提供一个代理(代理类),用来控制对这个对象的访问。委托类和代理类有一个共同的父类或父接口。代理类会对请求做预处理、过滤,将请求分配给指定对象。
静态代理
代理的三要素
a、有共同的行为(结婚) - 接口
b、目标角色(新人) - 实现行为
c、代理角色(婚庆公司) - 实现行为 增强目标对象行为
测试类
@Test
public void test01(){
You you =new You();
CompProxy proxy =new CompProxy(you);
proxy.toMarry();
}
委托类
public class You implements Marray{
@Override
public void toMarry() {
System.out.println("you结婚了");
}
}
代理类
public class CompProxy implements Marray{
private Marray marray;
public CompProxy(Marray marray) {
this.marray = marray;
}
@Override
public void toMarry() {
before();
marray.toMarry();
after();
}
private void after() {
System.out.println("after");
}
private void before() {
System.out.println("before");
}
}
共同实现的接口
public interface Marray {
public void toMarry();
}
动态代理
jdk代理
cglib代理
spring-mybatis
导入依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.yjxxt</groupId>
<artifactId>0701spring04_mybatis</artifactId>
<version>1.0-SNAPSHOT</version>
<name>0701spring04_mybatis</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<!-- spring 核心jar -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.4.RELEASE</version>
</dependency>
<!-- spring 测试jar -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.2.4.RELEASE</version>
</dependency>
<!-- spring jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.4.RELEASE</version>
</dependency>
<!-- spring事务 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.2.4.RELEASE</version>
</dependency>
<!-- aspectj切面编程的jar -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.5</version>
</dependency>
<!-- c3p0 连接池 -->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version>
</dependency>
<!-- mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.3</version>
</dependency>
<!-- 添加mybatis与Spring整合的核心包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.3</version>
</dependency>
<!-- mysql 驱动包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.19</version>
</dependency>
<!-- 日志打印相关的jar -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.2</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.2</version>
</dependency>
</dependencies>
<build>
<!---->
</build>
</project>
spring.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:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
https://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
https://www.springframework.org/schema/tx/spring-tx.xsd">
<!--开启扫描-->
<context:component-scan base-package="com.yjxxt"/>
<!--引入jdbc.properties-->
<context:property-placeholder file-encoding="utf-8" location="jdbc.properties"></context:property-placeholder>
<!--连接池-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="jdbcUrl" value="${jdbc.url}"></property>
<property name="driverClass" value="${jdbc.driver}"></property>
<property name="user" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
<!--SqlSessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--引入数据源-->
<property name="dataSource" ref="dataSource"></property>
<!--引入mybati核心配置文件-->
<property name="configLocation" value="mybatis.xml"></property>
</bean>
<!--事务管理器 xml 配置实现-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--Mapper-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--制定mapper的位置-->
<property name="basePackage" value="com.yjxxt.mapper"></property>
</bean>
<!--事务-->
<!--注解aop-->
<aop:aspectj-autoproxy/>
<!--注解事务的通知--><!--@Transactional(propagation = Propagation.REQUIRED)-->
<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
<!--aop-->
<aop:config>
<aop:pointcut id="pc" expression="execution(* com.yjxxt.service.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="pc"></aop:advisor>
</aop:config>
<!--通知-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="add*" propagation="REQUIRED"/>
<tx:method name="remove*" propagation="REQUIRED"/>
<tx:method name="change*" propagation="REQUIRED"/>
<tx:method name="insert*" propagation="REQUIRED"/>
<tx:method name="delete*" propagation="REQUIRED"/>
<!--只读模式-->
<tx:method name="find*" read-only="true"/>
</tx:attributes>
</tx:advice>
</beans>
mybatis.xml
<?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>
<!--setting-->
<settings>
<!--下划线转驼峰-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<!-- 定义类别名 -->
<typeAliases>
<package name="com.yjxxt.bean"/>
</typeAliases>
<!--扫描配置文件-->
<mappers>
<mapper resource="mappers/UserMapper.xml"></mapper>
</mappers>
</configuration>
log4j.properties
log4j.rootLogger=info, Console
# Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
log4j.logger.java.sql.ResultSet=INFO
log4j.logger.org.apache=INFO
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
jdbc.properties
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/sm?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false
jdbc.username=root
jdbc.password=123456
UserMapper.xml
位置
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yjxxt.mapper.UserMapper">
<!--根据Id查询用户信息-->
<select id="selectUserById" parameterType="int" resultType="User">
SELECT *
FROM TB_USER
WHERE USER_ID = #{USERID}
</select>
</mapper>
分层
数据库
插入数据
bean对象
user
private Integer userId;
private String userName;
private String userPwd;
private String userEmail;
private Date createDate;
private Date updateDate;
无参构造器,有参构造器,get和set方法,重写tostring;
mapper
UserMapper
public interface UserMapper {
public User selectUserById(int id);
}
service
UserService接口
public interface UserService {
public User findUserById(int id);
}
UserService实现类
UserServiceImpl
@Service//扫描
@Transactional(propagation = Propagation.REQUIRED)//事务
public class UserServiceImpl implements UserService {
@Autowired//自动装配
private UserMapper userMapper;
@Override
public User findUserById(int id) {
return userMapper.selectUserById(id);
}
}
controller
UserController
@Controller
public class UserController {
@Autowired
private UserService userService;
public User findUserById(int id){
return userService.findUserById(id);
}
}
测试类
public class TestUser {
@Test
public void test01(){
//读取配置文件
ApplicationContext app=new ClassPathXmlApplicationContext("spring.xml");
//获取Bean
UserController uc = app.getBean("userController", UserController.class);
//调用方法
User user = uc.findUserById(1);
//
System.out.println(user);
}
}
spring-test
ser findUserById(int id) {
return userMapper.selectUserById(id);
}
}
### controller
#### UserController
@Controller
public class UserController {
@Autowired
private UserService userService;
public User findUserById(int id){
return userService.findUserById(id);
}
}
### 测试类
public class TestUser {
@Test
public void test01(){
//读取配置文件
ApplicationContext app=new ClassPathXmlApplicationContext("spring.xml");
//获取Bean
UserController uc = app.getBean("userController", UserController.class);
//调用方法
User user = uc.findUserById(1);
//
System.out.println(user);
}
}
## spring-test