Spring核心: Ioc (控制反转):降低程序间的耦合(依赖关系)
spring配置:https://blog.csdn.net/qq_47959003/article/details/
Spring开发步骤:
- 导入Spring开发的基本包坐标
–Bean标签配置
ID:Bean实例在Spring容器中的唯一性标识
class:Bean的全限定名称
scope:singleton:默认属性,此时只有一个配置属性,只加载一个配置文件 prototype:此时会加载多个配置文件,地址不一样,运行实例会运行多次无参构造
- 创建Dao接口和实现类
- 创建Spring核心配置文件
- 在Spring配置文件中配置UserDaoImpl
- 使用Spring的API获得Bean实例
Spring重点配置:
<bean>
id属性:在容器中Bean实例的唯一标识,不允许重复
class属性:要实例化的Bean的全限定名
scope属性:Bean的作用范围,常用是Singleton(默认)和prototype
<property>标签:属性注入
name属性:属性名称
value属性:注入的普通属性值
ref属性:注入的对象引用值
<List>标签
<map>标签
<properties>标签
<constructor-arg>标签:属性内容同理bean
<import>标签:导入其他Spring分文件
Spring配置properties文件
<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" //表示引入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"> //导入context加载路径,复制beans,把beans改为context
<!-- 加载外部properties内容 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> //class 表示引入的解析文件对象
<property name=" " value="${key}"/> //name自定义,key为文件中的对应对象
</bean>
简单实现案例:
采用mvc(model,vision,controll)三层架构设计模式
设计Dao接口,Dao实现类接口,实现方法
Service层接口,service实现类接口,方法实现ApplicationContext对象实例化
controller实现Service对象方法,实例化对象实现方法
dao层:
接口:
public interface UserDao {
void run();
}
实现方法:
import com.example.spring_ioc_1.Dao.UserDao;
public class UserDaoImpl implements UserDao {
@Override
public void run() {
System.out.println("run.....");
}
}
Service层:
接口:
public interface UserService {
public void save();
}
实现方法:
import com.example.spring_ioc_1.Dao.UserDao;
import com.example.spring_ioc_1.Service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class UserServiceImpl implements UserService {
public void save() {
ApplicationContext app=new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao = (UserDao) app.getBean("userDao");
userDao.run();
}
}
web控制中心:
import com.example.spring_ioc_1.Service.UserService;
import com.example.spring_ioc_1.Service.impl.UserServiceImpl;
public class Controller {
public static void main(String[] args) {
UserService userService = new UserServiceImpl();
userService.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="userDao" class="com.example.spring_ioc_1.Dao.Impl.UserDaoImpl">
</bean>
<bean id="userService" class="com.example.spring_ioc_1.Service.impl.UserServiceImpl">
</bean>
</beans>
Bean依赖注入:
采用注入方法就不用实现方法
– 构造方法
name属性指向构造方法中的userDao,ref指向id中的userDao
– set方法
当注入的属性值较多时,使用p命名空间
属性注入
– 普通属性注入:
– 集合注入:
创建集合
map对象设置实现类
setter,getter,tostring方法
bean编写:
配置文件的引入:
当业务较多时,为了区分业务模块,可以进行模块的引入
Spring相应api:
当容器中的bean相同class属性只有一种时,可以使用
相同class出现多次时使用id指向唯一性:
数据源开发:
– c3p0数据源
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version>
</dependency>
@Test
//测试c3p0数据源
public void test1() throws PropertyVetoException, SQLException {
ComboPooledDataSource source = new ComboPooledDataSource();
source.setDriverClass("com.mysql.cj.jdbc.Driver");
source.setJdbcUrl("jdbc:mysql://localhost:3306");
source.setUser("sa");
source.setPassword("123456");
Connection connection = source.getConnection();
System.out.println(connection);
connection.close();
}
– druid数据源
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.8</version>
</dependency>
@Test
//测试druid数据源
public void test2() throws SQLException {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306");
dataSource.setUsername("sa");
dataSource.setPassword("123456");
DruidPooledConnection connection = dataSource.getConnection();
System.out.println(connection);
connection.close();
}
– 抽取properties文件进行测试
properties文件:
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306
jdbc.user=sa
jdbc.password=123456
@Test
//测试c3p0数据源(抽取properties文件)
public void test3() throws PropertyVetoException, SQLException {
//读取配置文件
ResourceBundle rb = ResourceBundle.getBundle("jdbc"); // 传入文件地址
String driver = rb.getString("jdbc.driver");
String url = rb.getString("jdbc.url");
String user = rb.getString("jdbc.user");
String password = rb.getString("jdbc.password");
//创建数据源对象,设置连接
ComboPooledDataSource dataSource=new ComboPooledDataSource();
dataSource.setDriverClass(driver);
dataSource.setJdbcUrl(url);
dataSource.setUser(user);
dataSource.setPassword(password);
Connection connection = dataSource.getConnection();
System.out.println(connection);
connection.close();
}
@Test
//测试druid数据源(抽取properties文件)
public void test4() throws SQLException {
//读取配置文件
ResourceBundle rb = ResourceBundle.getBundle("jdbc"); // 传入文件地址
String driver = rb.getString("jdbc.driver");
String url = rb.getString("jdbc.url");
String user = rb.getString("jdbc.user");
String password = rb.getString("jdbc.password");
//创建数据源对象,设置连接
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(driver);
dataSource.setUrl(url);
dataSource.setUsername(user);
dataSource.setPassword(password);
DruidPooledConnection connection = dataSource.getConnection();
System.out.println(connection);
connection.close();
}
spring加载数据源对象
根据抽取数据源对象的不同,需要注意class引用的对象
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.cj.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306"/>
<property name="user" value="sa"/>
<property name="password" value="123456"/>
</bean>
引入context命名空间
<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/contesxt/spring-context.xsd">
<!-- 上边引入的对象为context创造命名空间-->
spring加载外部properties文件,并且配置对象
模板:
<context:property-placeholder location="xxx.properties"/>
<property name=" " value="${ }"/>
实现:
<!-- 加载外部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.user}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
//测试spring容器产生数据源对象
public void test5() throws SQLException {
ApplicationContext app=new ClassPathXmlApplicationContext("applicationContext.xml");
ComboPooledDataSource dataSource = (ComboPooledDataSource) app.getBean("dataSource");
Connection connection = dataSource.getConnection();
System.out.println(connection);
connection.close();
}
注解开发:
案例实现:
配置Dao层
Service层
web层
以及applicationContext.xml文件
applicationContext.xml文件配置组件库的扫描,以便对注解开发的命令进行实例化
<!-- 配置组件扫描-->
<context:component-scan base-package="spring_ioc_1"/>
Dao层
userDaoImpl文件:(语句替换)
//<bean id="userDao" class="com.example.spring_ioc_1.Dao.Impl.UserDaoImpl"/>
("userDao")
userServiceIml文件:
@value标签
1:直接赋值普通属性
2:进行properties文件的抽取(spring需要配置命名空间)
注解标注:
4种注解含义一样,对于实现的层级不一样
初始方法,销毁方法
销毁方法需要在web层手动结束,初始方法在程序执行开始执行
实现在Dao层
web层关闭
Spring新注解:
配置spring核心类,还可以根据应用的不同建立不同的分文件
spring核心类,该类调用
//标志该类是Spring核心配置类
//<!-- 配置组件扫描-->
//<context:component-scan base-package="spring_ioc_1"/>
("spring_ioc_1")
//导入数据类对象到核心配置文件中来,当需要导入多个时用{}
({DataSourceConfiguration.class})
public class SpringConfiguration {
}
数据类:
//<!-- 加载外部properties文件-->
//<context:property-placeholder location="classpath:jdbc.properties"/>
("classpath:jdbc.properties")
public class DataSourceConfiguration {
("${jdbc.driver}")
private String driver;
("${jdbc.url}")
private String url;
("${jdbc.user}")
private String user;
("${jdbc.password}")
private String password;
("dataSource")
public ComboPooledDataSource getDataSource() throws PropertyVetoException {
//Spring会将当前的返回值以指定名称存储到Spring容器中
ComboPooledDataSource source = new ComboPooledDataSource();
source.setDriverClass(driver);
source.setJdbcUrl(url);
source.setUser(user);
source.setPassword(password);
return source;
}
}
基于Spring的Test框架:
导入配置:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
定义框架
//基于spring框架的测试
(SpringJUnit4ClassRunner.class)
//该方法为xml文档测试,声明Spring容器的架构指定
//@ContextConfiguration("classpath:applicationContext.xml")
(classes={SpringConfiguration.class})
进行测试编写
//进行字段注入
private UserService userService;
private DataSource dataSource;
public void test1() throws SQLException {
userService.save();
System.out.println(dataSource.getConnection());
}
Spring集成web环境——基本三层架构
业务层——>对象层——>Dao层
配置tomcat服务器
业务层:
public class userServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ApplicationContext app=new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = (UserService) app.getBean("userService");
userService.save();
}
}
web.xml配置
导入相应的坐标实现
<servlet>
<servlet-name>UserServlet</servlet-name>
<servlet-class>com.example.spring_ioc_1.web.userServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UserServlet</servlet-name>
<url-pattern>/userServlet</url-pattern>
</servlet-mapping>
实现监听对象,减少引用上下文实例的实现:
spring架构实现的应用上下文架构:
不知道为啥用不了
<!-- spring容器生命周期监听器配置 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 指定spring配置文件位置 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>