spring
Posted 小企鹅推雪球!
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring相关的知识,希望对你有一定的参考价值。
文章目录
Spring-IOC容器详解
第一:什么是IOC?
- Spring 容器是 Spring 框架的核心
- IOC是控制反转,减低代码之间的耦合度,将对象的创建和对象之间的调用的过程,交给Spring进行管理
- spring容器使用依赖注入(DI)来管理组成一个应用程序的组件,这些对象被称为Spring Beans
- 通过配置元数据文件,容器直到哪些对象进行实例化配置和组装,
- 配置元数据可以通过xml,Java注释活Java代码表示
第二:IOC容器是具有依赖注入功能的容器
- IOC容器可以创建对象,IOC容器负责实例化,定位,配置应用程序中的对象以及建立这些对象间的依赖
- 一般一个new实例,控制权由程序员控制,而控制反转是指new实例工作不由程序员来做,而是交给Spring容器来做,
- 在Spring中BeanFactory是IOC容器的实际代表者
Spring容器类型
- Spring提供了两种类型的容器
- Spring BeanFactory 容器它是最简单的容器,给 DI 提供了基本的支持,
- Spring ApplicationContext 容器该容器添加了更多的企业特定的功能,例如从一个属性文件中解析文本信息的能力,发布应用程序事件给感兴趣的事件监听器的能力。
- ApplicationContext 容器包括 BeanFactory 容器的所有功能,所以通常不建议使用BeanFactory。
- BeanFactory 仍然可以用于轻量级的应用程序,如移动设备或基于 applet 的应用程序,其中它的数据量和速度是显著。
Spring BeanFactory容器
- Spring BeanFactory容器是最简单的容器,主要的功能是为依赖注入(DI)提供这支持
- 在 Spring 中,有大量对 BeanFactory 接口的实现。其中,最常被使用的是 XmlBeanFactory 类。这个容器从一个 XML 文件中读取配置元数据,由这些元数据来生成一个被配置化的系统或者应用。
Spring应用程序示例
- 创建SpringExample工程闭关在src文件夹下创建名为 com.tutorialspoint 文件夹
- 选择 Add External JARs 选项,导入 Spring 的库文件,
- 在 com.tutorialspoint 文件夹下创建 HelloWorld.java 和 MainApp.java 两个类文件。
- 在 src 文件夹下创建 Bean 的配置文件 Beans.xml
HelloWorld.java
package com.tutorialspoint;
public class HelloWorld {
private String message;
public void setMessage(String message){
this.message = message;
}
public void getMessage(){
System.out.println("Your Message : " + message);
}
}
MainApp.java
package com.tutorialspoint;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
public class MainApp {
public static void main(String[] args) {
XmlBeanFactory factory = new XmlBeanFactory
(new ClassPathResource("Beans.xml"));
HelloWorld obj = (HelloWorld) factory.getBean("helloWorld");
obj.getMessage();
}
}
- 利用框架提供的 XmlBeanFactory() API 去生成工厂 bean 以及利用 ClassPathResource() API 去加载在路径 CLASSPATH 下可用的 bean 配置文件
- XmlBeanFactory()API负责创建并初始化所有的对象,即在配置文件bean配置
- 利用成的 bean 工厂对象的 getBean() 方法得到所需要的 bean。 通过配置文件中的 bean ID 来返回一个真正的对象,该对象最后可以用于实际的对象。一旦得到这个对象,你就可以利用这个对象来调用任何方法。
Beans.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-3.0.xsd">
<bean id="helloWorld" class="com.tutorialspoint.HelloWorld">
<property name="message" value="Hello World!"/>
</bean>
</beans>
Spring Bean的定义
- 在Spring IOC容器中,bean 是一个被实例化,组装,并通过 Spring IoC 容器所管理的对象
- Bean对象是用容器提供的配置元数据创建的
- bean定义包含配置元数据的信息
- class属性:指定用来创建bean的bean类
- name属性:指定唯一标识bean的标识符,在基于XML的配置元数据中,可以使用id或name属性指定bean标识符
- scope属性指定由特定的 bean 定义创建的对象的作用域
- constructor-arg 和 properties:用来注入依赖关系的
Spring配置元数据
- Spring IoC 容器完全由实际编写的配置元数据的格式解耦。
- 基于 XML 的配置文件
- 配置文件中有不同的 bean 定义,包括延迟初始化,初始化方法和销毁方法的:
<?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-3.0.xsd">
<!-- A simple bean definition -->
<bean id="..." class="...">
<!-- collaborators and configuration for this bean go here -->
</bean>
<!-- A bean definition with lazy init set on -->
<bean id="..." class="..." lazy-init="true">
<!-- collaborators and configuration for this bean go here -->
</bean>
<!-- A bean definition with initialization method -->
<bean id="..." class="..." init-method="...">
<!-- collaborators and configuration for this bean go here -->
</bean>
<!-- A bean definition with destruction method -->
<bean id="..." class="..." destroy-method="...">
<!-- collaborators and configuration for this bean go here -->
</bean>
<!-- more bean definitions go here -->
</beans>
- ①xmlns=“http://www.springframework.org/schema/beans”,默认命名空间:它没有空间名,用于Spring Bean的定义;
- ②xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”,xsi命名空间:这个命名空间用于为每个文档中命名空间指定相应的Schema样式文件,是标准组织定义的标准命名空间。
第二:IOC底层原理
- XML解析,工厂模式和反射
- IOC解耦的步骤
-
第一步:创建XML配置文件,配置创建对象
-
第二步:有service 类和dao类,创建工厂类
-
IOC接口
- IOC思想基于IOC容器完成,IOC容器底层是对象工厂
- Spring提供了IOC容器实现的两种方式:
- BeanFactory:IOC容器最基本的实现方式,是Spring内部的使用接口,在开发中一般不使用
- ApplicationContext::BeanFactory接口的子接口,在开发中使用,功能更强大
- BeanFactory特点:在加载配置文件的时候,不会创建对象,在获取对象(使用对象时)才会创建对象
- ApplicationContext特点:在加载配置文件的时候就会将配置文件中对象进行创建
- ApplicationContext接口的主要实现类:
- File需要写配置文件的盘符路径
- Class表示配置文件的当前目录下的配置的路径(不用写全)
IOC操作-Bean管理
- 什么是Bean管理:指两个操作
- 第一Spring创建对象
- 第二Spring注入属性
- Bean管理操作的两种实现方式
- 基于xml配置文件实现Bean管理
- 基于xml方式创建对象
1. 在spring配置文件中,使用bean标签,标签里添加对应属性,可以实现对象创建
2. 在bean标签中的常用属性
1. id属性,表示当前对象的唯一标识
2. class属性:标识类的全路径,即包类的路径
3. 创建对象的时候会默认执行无参数构造方法完成对象创建 - 基于xml方式注入属性
- DI:是依赖注入,就是注入属性(set方法注入,有参构造参数注入)
-
第一种注入方式;使用set方法进行注入
/** * 演示使用 set 方法进行注入属性 */ public class Book { //创建属性 private String bname; private String bauthor; //创建属性对应的 set 方法 public void setBname(String bname) { this.bname = bname; } public void setBauthor(String bauthor) { this.bauthor = bauthor; } }
-
在spring配置文件配置对象创建,配置属性注入
<!--2 set 方法注入属性--> <bean id="book" class="com.atguigu.spring5.Book"> <!--使用 property 完成属性注入 name:类里面属性名称 value:向属性注入的值 --> <property name="bname" value="易筋经"></property> <property name="bauthor" value="达摩老祖"></property> </bean>
-
- DI:是依赖注入,就是注入属性(set方法注入,有参构造参数注入)
- 基于xml方式创建对象
- 基于xml配置文件实现Bean管理
注入案例
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--1 配置User对象创建-->
<!--<bean id="user" class="com.atguigu.spring5.User"></bean>-->
<!--2 set方法注入属性-->
<bean id="book" class="com.atguigu.spring5.Book">
<!--使用property完成属性注入
name:类里面属性名称
value:向属性注入的值
-->
<property name="bname" value="易筋经"></property>
<property name="bauthor" value="达摩老祖"></property>
<!--null值-->
<!--<property name="address">
<null/>
</property>-->
<!--属性值包含特殊符号
1 把<>进行转义 < >
2 把带特殊符号内容写到CDATA
-->
<property name="address">
<value><![CDATA[<<南京>>]]></value>
</property>
</bean>
<!--3 有参数构造注入属性-->
<!--<bean id="orders" class="com.atguigu.spring5.Orders">
<constructor-arg name="oname" value="电脑"></constructor-arg>
<constructor-arg name="address" value="China"></constructor-arg>
</bean>-->
<!--2 set方法注入属性-->
<!--<bean id="book" class="com.atguigu.spring5.Book" p:bname="九阳神功" p:bauthor="无名氏">
</bean>-->
</beans>
package com.ryx.spring5;
/**
* 使用有参数构造注入
*/
public class Orders {
//属性
private String oname="";
private String address;
//有参数构造
public Orders(String oname,String address) {
this.oname = oname;
this.address = address;
}
public void ordersTest() {
System.out.println(oname+"::"+address);
}
}
以上是关于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(转)(代码片段