文章目录
初识spring
spring是什么
Spring是分层的 Java SE/EE应用 full-stack 轻量级开源框架,以 IoC(Inverse Of Control:反转控制)和AOP(Aspect Oriented Programming:面向切面编程)为内核。
spring的优势
-
方便解耦,简化开发
通过Spring提供的IOC容器可以将对象间的依赖关系交由Spring进行控制,避免硬编码所造成的过度耦合。 -
AOP编程的支持
通过Spring的AOP功能,方便进行面向切面编程,许多不容易通过OOP实现的功能可以通过AOP轻松实现。 -
声明式事务的支持
将我们从单调的事务管理代码中解放出来,通过声明式灵活的管理事务,提高开发效率和开发质量。 -
方便程序的测试
可以用非容器依赖的方式进行几乎所有的测试工作。 -
方便集成各种优秀框架
Spring支持各种优秀的框架(如Struts、Hibernate等)。 -
降低Java EE API的使用难度
Spring对Java EE API(如JDBC)进行了封装,使这些API的使用难度大为降低。 -
Java源码是经典学习典范。
spring的体系结构
spring程序开发
spring基本坐标
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.5 RELEASE</version>
</dependency>
spring配置文件
Bean标签基本配置
<bean id="userDao" class="com.day01.dao.impl.UserDaoImpl scope="singleton"></bean>
id:Bean实例在spring容器中的唯一标识
class:Bean的全限定名称
Bean的标签范围配置
singleton:默认值;单例;当spring核心文件加载时,实例化配置的Bean实例
prototype:多例;调用getBean方法时实例化Bean
Bean生命周期配置
init-method:指定类中的初始化方法名称
destroy-method:指定类中销毁方法名称
使用spring API
ApplicationContext app=new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService=(UserService)app.getBean("userService");
userService.save();
ClassPathXmlApplicationContext:它是从类的根路径下加载配置文件 。
FileSystemXmlApplicationContext:它是从磁盘路径上加载配置文件,配置文件可以在磁盘的任意位置。
AnnotationConfigApplicationContext :当使用注解配置容器对象时,需要使用此类来创建 spring 容器,它用来读取注解。
配置文件 import
主配置文件加载其他配置文件
<import resource=""/>
依赖注入
它是 Spring 框架核心 IOC 的具体实现。在编写程序时,通过控制反转,把对象的创建交给了 Spring,但是代码中不可能出现没有依赖的情况。IOC 解耦只是降低他们的依赖关系,但不会消除。例如:业务层仍会调用持久层的方法。那这种业务层和持久层的依赖关系,在使用 Spring 之后,就让 Spring 来维护了。简单的说,就是坐等框架把持久层对象传入业务层,而不用我们自己去获取。
Bean的依赖注入方式
set方法注入
在UserServiceImpl中添加setUserDao方法
public class UserServiceImpl implements UserService {
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
}
配置文件
<bean id="userDao" class="com.day01.dao.impl.UserDaoImpl"></bean>
<bean id="userService" class="com.day01.service.impl.UserServiceImpl">
<property name="userDao" ref="userDao"></property>
</bean>
构造方法注入
创建有参构造
public class UserServiceImpl implements UserService {
private UserDao userDao;
public UserServiceImpl(UserDao userDao) {
this.userDao = userDao;
}
}
配置文件
<bean id="userDao" class="com.day01.dao.impl.UserDaoImpl"></bean>
<bean id="userService" class="com.day01.service.impl.UserServiceImpl">
<constructor-arg name="userDao" ref="userDao"></constructor-arg>
</bean>
不同数据类型注入
UserDaoImpl类
public class UserDaoImpl implements UserDao {
private String userName;
private int age;
private List<String> strList;
private Map<String, User> userMap;
private Properties properties;
public void setProperties(Properties properties) {
this.properties = properties;
}
public void setStrList(List<String> strList) {
this.strList = strList;
}
public void setUserMap(Map<String, User> userMap) {
this.userMap = userMap;
}
public void setUserName(String userName) {
this.userName = userName;
}
public void setAge(int age) {
this.age = age;
}
public void save(){
System.out.println("save running.....");
}
}
引用数据类型
配置文件
<bean id="userDao" class="com.day01.dao.impl.UserDaoImpl"></bean>
<bean id="userService" class="com.day01.service.impl.UserServiceImpl">
<property name="userDao" ref="userDao"></property>
</bean>
普通数据类型
配置文件
<bean id="userDao" class="com.day01.dao.impl.UserDaoImpl">
<property name="userName" value="zhangsan"/>
<property name="age" value="18"/>
</bean>
集合数据类型
配置文件
<bean id="user1" class="com.day01.domain.User"></bean>
<bean id="userDao" class="com.day01.dao.impl.UserDaoImpl">
<property name="strList">
<list>
<value>aaa</value>
<value>bbb</value>
<value>ccc</value>
</list>
</property>
<property name="userMap ">
<map>
<entry key="user1" value-ref="user1"></entry>
</map>
</property>
<property name="properties ">
<props>
<prop key="p1">pp1</prop>
<prop key="p2">pp2</prop>
<prop key="p3">pp3</prop>
</props>
</property>
</bean>
spring 配置数据源
引入context命名空间和约束路径
Spring容器加载properties文件
<context:property-placeholder location="classpath:jdbc.properties"/>
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driver}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="user" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
AOP
快速入门
导入AOP相关坐标
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.13</version>
</dependency>
创建目标接口和目标类
public class TargetImpl implements TargetInterface {
@Override
public void method() {
System.out.println("run....");
}
}
创建切面类
public class Myaspect {
public void before(){
System.out.println("before.....");
}
}
配置目标类和切面类
<bean id="myaspect" class="com.day01.aop.Myaspect"></bean>
<bean id="target" class="com.day01.aop.impl.TargetImpl"></bean>
配置织入关系
<aop:config>
<aop:aspect ref="myaspect">
<aop:before method="before" pointcut="execution(public void com.day01.aop.impl.TargetImpl.method())"></aop:before>
</aop:aspect>
</aop:config>
切点表达式
表达式语法:execution([修饰符] 返回值类型 包名.类名.方法名(参数))
访问修饰符可以省略
返回值类型、包名、类名、方法名可以使用星号* 代表任意
包名与类名之间一个点 . 代表当前包下的类,两个点 … 表示当前包及其子包下的类
参数列表可以使用两个点 … 表示任意个数,任意类型的参数列表
常用:execution(* com.springStudy. aop. * .* (…) )
JdbcTemplate
导入坐标
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
spring产生JdbcTemplate对象
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
<property name="jdbcUrl" value="jdbc:mysql:///test"></property>
<property name="user" value="root"></property>
<property name="password" value="root"></property>
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
JdbcTemplate的常用操作
更新操作:
jdbcTemplate.update (sql,params)
查询操作:
jdbcTemplate.query (sql,Mapper,params)
jdbcTemplate.queryForObject(sql,Mapper,params)
事务控制
spring集成web环境
配置ContextLoaderListener监听器:导包spring-web,在web.xml中配置监听器。
使用WebApplicationContextUtils获得应用上下文