Spring学习步骤
- Spring概念
- IOC容器
- Aop
- JdbcTemplate
- 事务管理
- Spring5新特性
1. Spring概念
- Spring是轻量级的开源的javaEE框架
- Spring可以解决企业应用开发的复杂性
- Spring由两部分核心:IOC和Aop
- IOC:控制反转,把创建对象过程交给Spring进行管理
- Aop:面向切面编程,在不修改源代码的情况下,进行功能的增加和增强
- Spring特点
- 方便解耦,简化开发
- Aop编程支持
- 方便程序测试
- 方便和其他框架进行整合
- 方便进行事务操作
- 降低API开发难度
2. IOC容器
1、IOC底层原理
- 什么是IOC?
- 控制反转,把对象创建和对象之间的调用过程,交给Spring进行管理
- 使用IOC的目的:为了耦合度降低
- IOC底层原理:xml解析、工厂模式、反射
2、IOC接口(BeanFactory)
- IOC思想基于IOC容器完成,IOC容器底层就是对象工厂
- Spring提供IOC容器实现两种方式(两个接口)
- BeanFactory:IOC容器基本实现,是Spring内部接口,不提供开发人员使用加载配置文件时不会创建对象,在获取配置对象使用时才会去创建对象
- ApplicationContext:BeanFactory接口的子接口,提供更多强大的功能,一般由开发人员使用加载配置文件时会创建对象
3、IOC操作Bean管理(基于xml)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kisQIIxf-1620445054501)(img/QQ截图20210401094245.png)]
1、Spring创建对象
<bean id="user" class="com.hello.test.User"></bean>
2、Spring依赖注入的两种方式:
-
构造方法
-
set方法
private UserDao userDao; public void setUserDao(UserDao userDao) { this.userDao = userDao; }
<bean id="userService" class="com.hello.service.impl.UserServiceImpl"> <property name="userDao" ref="userDao"></property> </bean><bean id="userService" class="com.hello.service.impl.UserServiceImpl"> <property name="userDao" ref="userDao"></property> </bean> <!--通过p命名空间引入--> <!--<bean id="userService" class="com.hello.service.impl.UserServiceImpl" p:userDao-ref="userDao"/>-->
3、Bean的依赖注入的数据类型
-
普通数据类型
-
引用数据类型
-
集合数据类型
-
package com.hello.dao.impl; import com.hello.dao.UserDao; import com.hello.domain.User; import java.util.List; import java.util.Map; import java.util.Properties; public class UserDaoImpl implements UserDao { private List<String> strList; private Map<String, User> userMap; private Properties properties; public void setStrList(List<String> strList) { this.strList = strList; } public void setUserMap(Map<String, User> userMap) { this.userMap = userMap; } public void setProperties(Properties properties) { this.properties = properties; } //普通数据类型 private String username; private int age; public void setUsername(String username) { this.username = username; } public void setAge(int age) { this.age = age; } @Override public void save() { // System.out.println(username+"=="+age); System.out.println(strList); System.out.println(userMap); System.out.println(properties); System.out.println("save()方法"); } }
<bean id="userDao" class="com.hello.dao.impl.UserDaoImpl"> <property name="strList"> <list> <value>aaa</value> <value>bbb</value> <value>ccc</value> </list> </property> <property name="userMap"> <map> <entry key="u1" value-ref="user1"/> <entry key="u2" value-ref="user2"/> </map> </property> <property name="properties"> <props> <prop key="p1">ppp1</prop> <prop key="p2">ppp2</prop> <prop key="p3">ppp3</prop> </props> </property> </bean> <bean id="user1" class="com.hello.domain.User"> <property name="name" value="tom"/> <property name="addr" value="beijing"/> </bean> <bean id="user2" class="com.hello.domain.User"> <property name="name" value="lucy"/> <property name="addr" value="shandong"/> </bean> <!--普通数据类型--> <bean id="userDao" class="com.hello.dao.impl.UserDaoImpl"> <property name="username" value="zhangsan"/><!--对象用ref,普通数据用value--> <property name="age" value="18"/> </bean>
4、
5、import引入其他配置文件(分模块开发)
3.数据源
数据源(连接池)的作用
-
数据源(连接池)是提高程序性能如出现的。事先实例化数据源,初始化部分连接资源·使用连接资源时从数据源中获取
-
数据源(连接池)是提高程序性能如出现的.事先实例化数据源,初始化部分连接资源
-
使用连接资源时从数据源中获取
-
使用完毕后将连接资源归还给数据源
-
常见的数据源(连接池):DBCP、C3PO、BoneCP、Druid等
public class DataSourceTest {
//测试spring容器产生数据源对象
@Test
public void test4() throws Exception {
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
DataSource dataSource = app.getBean(DataSource.class);
Connection connection = dataSource.getConnection();
System.out.println(connection);
connection.close();
}
//测试手动创建c3p0 数据源(加载properties配置文件)
@Test
public void test3() throws Exception {
ResourceBundle rb = ResourceBundle.getBundle("jdbc");
String driver = rb.getString("jdbc.driver");
String url = rb.getString("jdbc.url");
String username = rb.getString("jdbc.username");
String password = rb.getString("jdbc.password");
//创建数据源,设置连接参数
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setDriverClass(driver);
dataSource.setJdbcUrl(url);
dataSource.setUser(username);
dataSource.setPassword(password);
Connection connection = dataSource.getConnection();
System.out.println(connection);
connection.close();
}
//测试手动创建druid数据源
@Test
public void test2() throws Exception {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/test?serverTimezone=UTC&rewriteBatchedStatements=true&useServerPstmts=true");
dataSource.setUsername("root");
dataSource.setPassword("123456");
DruidPooledConnection connection = dataSource.getConnection();
System.out.println(connection);
connection.close();
}
//测试手动创建c3p0 数据源
@Test
public void test1() throws Exception {
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setDriverClass("com.mysql.cj.jdbc.Driver");
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test?serverTimezone=UTC&rewriteBatchedStatements=true&useServerPstmts=true");
dataSource.setUser("root");
dataSource.setPassword("123456");
Connection connection =dataSource.getConnection();
System.out.println(connection);
connection.close();
}
}
applicationContextxml加载jdbc.properties配置文件获得连接信息。
1、引入context命名空间