Spring开发实战
1.Spring项目构建
2.Spring开发步骤
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xnsvyEID-1612786566029)(D:\code\source_posts\spring开发\image-20210122182416415.png?lastModify=1611459280)]
-
导入spring开发的基本包坐标(pom.xml)
-
编写Dao接口和实现类(java)
-
创建Spring核心配置文件resources(applicationContext.xml)
-
在Spring配置文件中配置UserDaoImpl
-
使用spring的API获得Bean实例
3.Spring配置文件
3.1Bean标签基本配置
默认情况下调用类重无参构造函数
基本属性:
id:Bean实例在Spring容器中的唯一标识
class:Bean的全限定名称
3.2Bean标签范围配置
scope(对象的作用范围):singleton(默认的、单例的)、prototype(多例)、request、session、global session
3.3Bean生命周期配置
init-method:指定类中的初始化方法
destory-method:指定类中销毁方法
3.4Bean实例化的三种方式
无参构造方法实例化
- 工厂静态方法实例化
- 工厂实例方法实例化
3.5Bean配置文件-依赖注入
在Spring容器中,将UserDao设置到UserService内部
依赖注入(Dependency Injection):IOC的具体实现
注入方法:
<?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 http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="userDao" class="com.zzx.dao.impl.UserDaoImpl"></bean>
<bean id="userService" class="com.zzx.service.impl.UserServiceImpl">
<property name="userDao" ref="userDao"></property>
<!--name属性名称 value注入属性值 ref注入对象引用值-->
</bean>
</beans>
-
构造方法
-
set方法
public class UserServiceImpl implements UserService { private UserDao userDao; public void setUserDao(UserDao userDao){ this.userDao = userDao; } public void save(){ userDao.save(); } }
4.Spring相应API
4.1 ApplicationContext的实现类
- ClassPathXmlApplicationContext(从类的根路径下加载配置文件)
- FileSystemXmlApplicationContext(从磁盘路径加载)
- AnnotationConfigApplicationContext(使用注解配置容器对象)
4.2 getBean()方法使用
- public Object getBean(String name) //通过id
- public T getBean(Class requiredType) //根据Class
5.Spring配置数据源
5.1数据源(连接池)
常见数据源(连接池):DBCP、C3P0、BoneCP、Druid
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.22</version>
</dependency>
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.1</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.13</version>
</dependency>
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/db01?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT
jdbc.username=root
jdbc.password=abc@123
5.2通过Spring加载properities
-
pom文件加dependency(Spring-context)
-
配置bean
6.Spring注解开发
简化配置
6.1 Spring原始注解(替代配置)
//Dao层
@Component("userDao") //表示Spring Ioc会把这个类扫描成一个bean实例,其中value表示类在Spring中的Id
public class UserDaoImpl implements UserDao {
public void save(){
System.out.println("saving");
}
}
//Service层
@Component("userService")
public class UserServiceImpl implements UserService {
//自动装配技术:Spring自己发现对应的Bean,自动完成装配工作的方式
@Autowired //按照数据类型从Spring容器中进行匹配
@Qualifier("userDao") //按照id从容器中进行匹配,要结合@AutoWired一起使用
private UserDao userDao;
public void setUserDao(UserDao userDao){
this.userDao = userDao;
}
public void save(){
userDao.save();
}
}
//applicationContext.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"
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">
<bean id="userDao" class="com.zzx.dao.impl.UserDaoImpl"></bean>
<bean id="userService" class="com.zzx.service.impl.UserServiceImpl">
<property name="userDao" ref="userDao"></property>
</bean>
<!--配置组件扫描-->
<context:component-scan base-package="com.zzx"/>
</beans>
6.2 Spring新注解
@Configuration:必须要有,用于解析其中的@Bean注解
@Bean: 注解在方法上,使之成为Spring的Bean资源
package pojo;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class BeanTester {
@Bean(name = "testBean")
public String test() {
String str = "测试@Bean注解";
return str;
}
}
7.Spring AOP
7.1使用注解开发Spring AOP
-
选择连接点(某个方法)
//pojo.Landlord .... public void service() { // 仅仅只是实现了核心的业务功能 System.out.println("签合同"); System.out.println("收房租"); } ....
-
创建切面
(可以把切面理解为一个拦截器,当程序运行到连接点的时候,被拦截下来,在开头加入了初始化的方法,在结尾也加入了销毁的方法)
package aspect; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.springframework.stereotype.Component; @Component @Aspect //使用该注解,Spring IoC容器会认为这是一个切面 class Broker { /* @Pointcut("execution(* pojo.Landlord.service())") public void lService() { } */ @Before("execution(* pojo.Landlord.service())") //前置通知,在连接点方法前使用 public void before(){ System.out.println("带租客看房"); System.out.println("谈价格"); } @After("execution(* pojo.Landlord.service())") //后置通知,在连接点方法后调用 public void after(){ System.out.println("交钥匙"); } /* 使用 @Around 注解来同时完成前置和后置通知 @Around("execution(* pojo.Landlord.service())") public void around(ProceedingJoinPoint joinPoint) { System.out.println("带租客看房"); System.out.println("谈价格"); try { joinPoint.proceed(); } catch (Throwable throwable) { throwable.printStackTrace(); } System.out.println("交钥匙"); } */ } }
-
定义切点
- execution:代表执行方法的时候会触发
*
:代表任意返回类型的方法- pojo.Landlord:代表类的全限定名
- service():被拦截的方法名称
-
测试AOP
7.2使用XML配置开发Spring AOP
<!-- 装配 Bean-->
<bean name="landlord" class="pojo.Landlord"/>
<bean id="broker" class="aspect.Broker"/>
<!-- 配置AOP -->
<aop:config>
<!-- where:在哪些地方(包.类.方法)做增加 -->
<aop:pointcut id="landlordPoint"
expression="execution(* pojo.Landlord.service())"/>
<!-- what:做什么增强 -->
<aop:aspect id="logAspect" ref="broker">
<!-- when:在什么时机(方法前/后/前后) -->
<aop:around pointcut-ref="landlordPoint" method="around"/>
</aop:aspect>
</aop:config>
8.Jdbc Template基本使用
8.1 JdbcTemplate开发步骤
- 导入spring-jdbc和spring-tx坐标
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.1</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.3.1</version>
</dependency>
-
创建数据库表和实体
-
创建JdbcTemplate对象
-
执行数据库操作
public class JdbcTemplateTest {
@Test
public void test1() throws Exception {
//创建数据源
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setDriverClass("com.mysql.cj.jdbc.Driver");
dataSource.setJdbcUrl("jdbc:mysql://127.0.0.1:3306/db01?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT");
dataSource.setUser("root");
dataSource.setPassword("abc@123");
JdbcTemplate jdbcTemplate = new JdbcTemplate();
jdbcTemplate.setDataSource(dataSource); //设置数据源
//执行操作
int row = jdbcTemplate.update("insert into account values(?,?)","a",5000);
System.out.println(row);
}
}
8.2 Spring开发JdbcTemplate
9.Spring事务控制
- @Transcational