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标签

属性说明取值
idBean实例在Spring容器中的唯一标识
classBean的全限定名称
scope对象的作用范围singleton单例(默认值)
prototype多例的
init-method指定类中的初始化方法名称
destroy-method指定类中销毁方法名称
factory-method工厂静态方法实例化
factory-bean工厂实例方法实例化提供实例方法的class的id

补充:

□ singleton与prototype的区别

singletonprototype
实例个数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方法注入,但更加方便,主要体现在配置文件中

  1. 引入p命名空间:
    xmlns:p="http://www.springframework.org/schema/p"
  2. 修改注入方式:
    <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 标签小结

标签/属性说明
beanbean容器标签
import引入其他配置文件
id属性Bean实例的唯一标识
class属性要实例化的Bean的全限定名
scope属性Bean的作用范围,常用是Singleton(默认)和prototype
property属性注入
name属性属性名称
value属性注入的普通属性值
ref属性注入的对象引用值
listlist集合注入标签
mapmap集合注入标签
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(转)(代码片段

一张图帮你记忆,Spring Boot 应用在启动阶段执行代码的几种方式