Spring
Posted 364.99°
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring相关的知识,希望对你有一定的参考价值。
目录
1.概述
Spring: 分层的 Java SE/EE应用 full-stack 轻量级(轻代码,重配置)开源框架,以 IoC(Inverse Of Control:反转控制)和 AOP(Aspect Oriented Programming:面向切面编程)为内核。
spring基本开发步骤:
1.导入maven依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version></version>
</dependency>
2.创建实现类
3.new-springconfig xml配置文件
<bean id="唯一标识" class="实现类全类名" ></bean>
4.测试类获取bean
new ClassPathXmlApplicationContext("xml文件名.xml");//加载配置文件
context.getBean("唯一标识(id)");//获取对象
......
2.配置文件
引入其他配置文件:
分模块开发,最终在Spring主配置文件通过import标签进行加载其他配置文件
<import resource="xxx.xml"/>
2.1 bean标签
属性 | 说明 | 取值 |
---|---|---|
id | Bean实例在Spring容器中的唯一标识 | |
class | Bean的全限定名称 | |
scope | 对象的作用范围 | singleton 单例(默认值)prototype 多例的 |
init-method | 指定类中的初始化方法名称 | |
destroy-method | 指定类中销毁方法名称 | |
factory-method | 工厂静态方法实例化 | |
factory-bean | 工厂实例方法实例化 | 提供实例方法的class的id |
补充:
□ singleton与prototype的区别
singleton | prototype | |
---|---|---|
实例个数 | 1 | 多 |
实例时期 | Spring核心文件被加载时 | 调用getBean()时 |
对象销毁 | 应用卸载,销毁容器时 | 对象长时间不用时,被JVM回收 |
□Bean的三种实例化方式
■无参构造方法
配置文件:<bean id="唯一标识" class="全类名"/>
■工厂静态方法
配置文件:<bean id="唯一标识" class="全类名" factory-method="静态工厂方法名" />
■工厂实例方法
配置文件:<bean id="标识1" class="全类名"/>
<bean id="标识2" factory-bean="标识1" factory-method="工厂实例方法名"/>
2.2 依赖注入Ⅰ
两种注入属性的方法:
依赖注入(Dependency Injection): Spring 框架核心 IOC 的具体实现。
框架将持久层对象传入业务层,无需自己去获取
set方法注入:
□在ClassB中添加setClassA方法
public class ClassB
private ClassA classA;
public void setClassA(ClassA classA)
this.classA = classA;
□配置Spring容器调用set方法进行注入
<bean id="标识1" class="ClassA全类名"/>
<bean id="标识2" class="ClassB全类名">
<property name="classA" ref="标识1"/>
</bean>
p命名空间写法:
P命名空间注入本质也是set方法注入,但更加方便,主要体现在配置文件中
- 引入p命名空间:
xmlns:p="http://www.springframework.org/schema/p"
- 修改注入方式:
<bean id="标识1" class="ClassA全类名"/>
<bean id="标识符2" class="ClassB全类名" p:classA- ref="标识1"/>
构造方法注入:
有参构造
□在ClassB中添加ClassA的有参构造方法
public class ClassB
private Class A classA;
public ClassB(Class A classA)
this.classA = classA;
public ClassB()
□配置Spring容器调用有参构造时进行注入
<bean id="标识1" class="ClassA全类名"/>
<bean id="标识2" class="ClassB全类名">
<constructor-arg name="标识1" ref="classA"></constructor-arg>
</bean>
2.3 依赖注入Ⅱ
三种数据类型的注入:
普通数据类型:
选用set
public class ClassB
//普通属性
private int id;
public void setId(int id)
this.id = id;
<bean id="标识2" class="ClassB全类名">
<property name="id" value="1"></property>
</bean>
引用数据类型输入:
public class ClassB
private ClassA classA;
public void setClassA(ClassA classA)
this.classA = classA;
<bean id="标识1" class="ClassA全类名"/>
<bean id="标识2" class="ClassB全类名">
<property name="classA" ref="标识1"/>
</bean>
集合数据类型的注入:
选用set
public class ClassB
private List<Integer> list;
private Map<Integer,ClassA> map;
private Properties properties;
public void setList(List<Integer> list)
this.list = list;
public void setList(Map<Integer,ClassA> map)
this.map = map;
public void setProperties(Properties properties)
this.properties= properties;
<bean id="标识2" class="ClassB全类名">
<property name="list">
<list>
<value>13</value>
<value>39</value>
</list>
</property>
<property name="map">
<map>
<entry key="1" value-ref="A1"></entry>
<entry key="2" value-ref="A2"></entry>
</map>
</property>
<property name="properties">
<props>
<pop key="p1">111</pop>
<pop key="p2">222</pop>
<pop key="p3">333</pop>
</props>
</property>
</bean>
2.4 标签小结
标签/属性 | 说明 |
---|---|
bean | bean容器标签 |
import | 引入其他配置文件 |
id 属性 | Bean实例的唯一标识 |
class 属性 | 要实例化的Bean的全限定名 |
scope 属性 | Bean的作用范围,常用是Singleton(默认)和prototype |
property | 属性注入 |
name 属性 | 属性名称 |
value 属性 | 注入的普通属性值 |
ref 属性 | 注入的对象引用值 |
list | list集合注入标签 |
map | map集合注入标签 |
constructor-arg | 构造方法注入标签 |
3.相关API
3.1 ApplicationContext
applicationContext
:接口类型,代表引用上下文,可以通过其实例获得 Spring 容器中的 Bean 对象
ApplicationContext的实现类:
□ ClassPathXmlApplicationContext
:从类的根路径下加载配置文件
□ FileSystemXmlApplicationContext
: 从磁盘路径上加载配置文件,配置文件可以在磁盘的任意位置
□ AnnotationConfigApplicationContext
:使用注解配置容器对象时,需要使用此类来创建 spring 容器,用来读取注解。
3.2 getBean()
getBean(参数)
:
□ 参数的数据类型是字符串:表示根据Bean的id从容器中获得Bean实例,返回是Object,需要强转
□ 参数的数据类型是Class类型:根据类型从容器中匹配Bean实例,当容器中相同类型的Bean有多个时,则此方法会报错
4.配置数据源
数据源(连接池)的作用:
- 提高程序性能
- 事先实例化数据源,初始化部分连接资源
- 使用连接资源时从数据源中获取
- 使用完毕后将连接资源归还给数据源
常见的数据源:DBCP、C3P0、BoneCP、Druid…
4.1 创建数据源
① 导入数据源的坐标和数据库驱动坐标
□ 导入c3p0和druid的坐标
<!-- C3P0连接池 -->
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>...</version>
</dependency>
<!-- Druid连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>...</version>
</dependency>
□ 导入mysql数据库驱动坐标
<!-- mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>...</version>
</dependency>
② 创建连接池
□ 创建C3P0连接池
@Test
public void testC3P0() throws Exception
//创建数据源
ComboPooledDataSource dataSource = new ComboPooledDataSource();
//设置数据库连接参数
dataSource.setDriverClass("com.mysql.jdbc.Driver");
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/数据库名");
dataSource.setUser("账号");
dataSource.setPassword("密码");
//获得连接对象
Connection connection = dataSource.getConnection();
□ 创建Druid连接池
@Test
public void testDruid() throws Exception
//创建数据源
DruidDataSource dataSource = new DruidDataSource();
//设置数据库连接参数
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/数据库名");
dataSource.setUsername("账号");
dataSource.setPassword("密码");
//获得连接对象
Connection connection = dataSource.getConnection();
□ 提取jdbc.properties配置文件
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/数据库名
jdbc.username=账号
jdbc.password=密码
@Test
public void testC3P0ByProperties() throws Exception
//加载类路径下的jdbc.properties
ResourceBundle rb = ResourceBundle.getBundle("jdbc");
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setDriverClass(rb.getString("jdbc.driver"));
dataSource.setJdbcUrl(rb.getString("jdbc.url"));
dataSource.setUser(rb.getString("jdbc.username"));
dataSource.setPassword(rb.getString("jdbc.password"));
Connection connection = dataSource.getConnection();
4.2 Spring创建数据源
将DataSource的创建权交由Spring容器去完成:
- Spring默认用无参构造实例化对象,DataSource有无参构造
- DataSource要想使用需要通过set方法设置数据库连接信息,而Spring可以通过set方法进行字符串注入
① 导入Spring-context坐标
<!-- Druid连接池 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>...</version>
</dependency>
② 创建配置文件
创建C3P0连接池:
<bean id="标识" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/数据库名"/>
<property name="user" value="账号"/>
<property name="password" value="密码"/>
</bean>
③ 从容其中获取数据源
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("xxx.xml");
DataSource dataSource = (DataSource) applicationContext.getBean("标识");
Connection connection = dataSource.getConnection();
加载jdbc.propertoes文件
xxx.xml加载jdbc.properties配置文件获得连接信息
□ 引入context命名空间和约束路径
命名空间:
xmlns:context="http://www.springframework.org/schema/context"
约束路径:
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
<!--spring加载properties配置文件-->
<context:property-placeholder location="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>
5.注解开发
注解代替xml配置文件可以简化配置,提高开发效率
5.1 Spring原始注解
Spring原始注解主要是替代的配置
注解 | 说明 |
---|---|
@Component | 使用在类上用于实例化Bean |
@Controller | 使用在web层类上用于实例化Bean |
@Service | 使用在service层类上用于实例化Bean |
@Repository | 使用在dao层类上用于实例化Bean |
@Autowired | 使用在字段上用于根据类型依赖注入 |
@Qualifier | 结合@Autowired一起使用用于根据名称进行依赖注入 |
@Resource | 相当于@Autowired+@Qualifier,按照名称进行注入 |
@Value | 注入普通属性 |
@Scope | 标注Bean的作用范围 |
@PostConstruct | 使用在方法上标注该方法是Bean的初始化方法 |
@PreDestroy | 使用在方法上标注该方法是Bean的销毁方法 |
注意: 使用注解进行开发时,需要在.xml配置文件中配置组件扫描,以指定哪个包及其子包下的Bean需要进行扫描以便识别使用注解配置的类、字段和方法。
<!--注解的组件扫描-->
<context:component-scan base-package="包名"></context:component-scan>
//<bean id="标识2" class="全类名"></bean>
//@Component("标识2")
@Service("标识2")
@Scope("prototype")
public class ClassB
/*将classA注入classB:
<property name="classA" value="1"></property>
*/
@Autowried
@Qualifier("classA")//按照id从容其中进行匹配
//@Resource(name="classA")//相当于@Autowried+@Resource
@Value("$jdbc.driver")//一般用于读取property配置文件,注入属性
private String driver;
private int id;
public void setId(int id)
this.id = id;
@PostConstruct
public void init()
System.out.println("init..."以上是关于Spring的主要内容,如果未能解决你的问题,请参考以下文章
Spring boot:thymeleaf 没有正确渲染片段
What's the difference between @Component, @Repository & @Service annotations in Spring?(代码片段
spring练习,在Eclipse搭建的Spring开发环境中,使用set注入方式,实现对象的依赖关系,通过ClassPathXmlApplicationContext实体类获取Bean对象(代码片段
Spring Rest 文档。片段生成时 UTF-8 中间字节无效 [重复]
解决spring-boot启动中碰到的问题:Cannot determine embedded database driver class for database type NONE(转)(代码片段