Spring入门
Posted 大忽悠爱忽悠
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring入门相关的知识,希望对你有一定的参考价值。
Spring相关知识点整理
- Spring体系结构
- Spring程序开发步骤
- Spring配置文件
- Bean标签的基本配置
- Bean标签的范围配置
- 内部Bean----匿名,外部无法访问,无别名
- util名称空间---创建集合的id,方便引用
- 级联属性----选择属性的属性
- ref引用是地址引用,可以理解为c++里面的地址传递
- 继承配置信息
- abstract---当前bean只能被其他bean继承相关配置数据,而无法创建实例化的bean对象,不用写全类名
- IOC容器创建时候,容器中的所有Bean对象也会随之创建,并且Bean标签就等同于new 一个Bean对象,会在创建的Bean对象的时候,调用其无参构造。
- Bean的创建顺序是按照xml中配置顺序创建的
- Spring 给Bean属性注入null值
- 在容器中注册一个组件(Bean标签就是组件的注册,等同于new一个Bean对象)时,同一个组件(对象)默认是单例的,容器启动完成,容器中所有组件创建完毕
- IOC容器在创建组件对象的时候,如果使用Property标签对属性进行赋值,那么默认利用对象的setter属性进行赋值
- javaBean对象的属性名由对象的setter方法,去掉set后面,后面的那一串首字母小写就是属性名
- getBean方法的三个重置版本
- Bean(对象)的生命周期配置
- 单例Bean的生命周期: (容器启动)构造器------>初始化方法---->容器关闭(销毁方法)
- 多例Bean的生命周期: 获取Bean(构造器---->初始化方法)---->容器关闭不会调用Bean的销毁方法
- 后置处理器----在Bean初始化前面调用该方法
- Bean(对象)实例化的三种方式
- FactoryBean: 是Spring规定的一个接口,只要是这个接口的实现类,Spring都默认是一个工厂,并且无论指定工厂中创建的对象是单例还是多例,都是在获取的时候才会创建对象,IOC容器启动的时候不会创建实例
- 依赖注入方式
- Bean的依赖注入的数据类型
- ApplicationContext的继承体系
- ApplicationContext的实现类
- getBean()两个重载方法的使用
- Spring配置数据源---连接池
- Spring配置数据源
- Spring注解开发
- Spring新注解
- Spring集成Junit
- Spring集成web环境
- 监听器的妙用---加载配置文件
- Spring提供获取应用上下文的工具---上面是铺垫
- AOP
- 基于XML的AOP开发
- 快速入门的步骤
- 1.导入aspectj的坐标
- 2.目标接口和目标类
- 接口不用加载到容器中,即使加载到了容器中,也不会创建对象,相当于告诉了Spring容器,ioc容器中可能有这种类型的组件
- 3.切面类
- 4.目标类和切面类交给Spring容器去创建
- 5.在app.xml中配置织入关系---引入aop命名空间
- 6.测试代码
- 如果目标类有实现接口,那么AOP底层原理即使jdk动态代理,容器中保存的组件是其代理对象,而非本类类型,因此再使用getBean获取实例的时候,如果通过字节码文件类型获取,参数应该填入接口类型,返回值也用接口类型来接
- 如果目标类没有实现接口,那么AOP底层实现原理就是cglib,我们可以用目标类去接,相当于多态形式
- 切点表达式的写法
- 通知的类型
- 切点表达式的抽取
- 基于注解的AOP开发
- Spring的JDBCTemplte
Spring体系结构
Spring程序开发步骤
1.创建一个maven项目,在pom.xml中导入spring的坐标
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>SpringDemo2</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.15.RELEASE</version>
</dependency>
</dependencies>
</project>
2.创建UserDao接口和UserDao接口的实现类UserDaoImpl
3.创建spring的xml配置文件,然后在其中给实现类标注id
<bean id="userDao" class="com.impl.UserDaoImpl"></bean>
- 创建一个测试Demo,查看是否能够获取指定实现类对象,并调用其方法
public class testDemo {
public static void main(String[] args) {
ApplicationContext app=new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao = (UserDao) app.getBean("userDao");
userDao.say();
}
}
Spring配置文件
Bean标签的基本配置
Bean标签的范围配置
默认是singleton
默认情况下演示:
<bean id="userDao" class="com.impl.UserDaoImpl"></bean>
ApplicationContext app=new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao = (UserDao) app.getBean("userDao");
UserDao userDao1=(UserDao)app.getBean("userDao");
System.out.println(userDao);
System.out.println(userDao1);
默认单例模式
ApplicationContext app=new ClassPathXmlApplicationContext("applicationContext.xml");
意思是加载配置文件,创建Spring容器
内部Bean----匿名,外部无法访问,无别名
1.在或内部通过定义的,
2.该bean不管是否指定id或者name,该bean都有一个唯一的匿名标识符,且不能被指定别名
3.该bean队其他外部的bean不可见。
util名称空间—创建集合的id,方便引用
Util名称空间创建的集合有id,可以给其他bean引用,在使用前需要引入名称空间:
xmlns:util=“http://www.springframework.org/schema/util”
<?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:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">
<!-- 相当于new LinkedHashMap() -->
<util:map id="myMap">
<entry key="key01" value="value01"></entry>
</util:map>
<bean id="person" class="com.atguigu.bean.Person">
<!-- 引用myMap -->
<property name="map" ref="myMap"></property>
</bean>
</beans>
级联属性----选择属性的属性
通过属性(a)选择属性(a)的属性(b)
<bean id="car01" class="com.atguigu.bean.Car">
<property name="carName" value="宝马"></property>
</bean>
<!-- 级联属性:属性的属性 -->
<bean id="person01" class="com.atguigu.bean.Person">
<!-- 为car赋值的时候改变car的属性 -->
<property name="car" ref="car01"></property>
<!-- 给car属性的carName属性赋值 -->
<property name="car.carName" value="奔驰"></property>
</bean>
ref引用是地址引用,可以理解为c++里面的地址传递
继承配置信息
在bean定义中包含了大量的配置信息,其中包括容器相关的信息(比如初始化方法、静态工厂方法名等等)以及构造器参数和属性值。子bean定义就是从父bean定义继承配置数据的bean定义。它可以覆盖父bean的一些值,或者添加一些它需要的值。使用父/子bean定义的形式可以节省很多的输入工作。实际上,这就是一种模板形式。
class全类名也会继承,但是只是继承配置信息,而不是父子关系
全类名省略不写的前提时,当前bean对象的类型与继承的bean类型一致
如果需要对继承的数据进行修改,就自行对相关属性再赋值,完成值的覆盖
<bean id="parent" class="com.timo.domain.Parent">
<property name="name" value="ouyangfeng"/>
</bean>
<!--下面的parent表示这个child的bean的父亲是id=parent的这个类-->
<bean id="child" class="com.timo.domain.Child" parent="parent">
<property name="age" value="18"/>
</bean>
abstract—当前bean只能被其他bean继承相关配置数据,而无法创建实例化的bean对象,不用写全类名
下面说的就是: 抽象bean不必映射到任何类,即不用写全类名
IOC容器创建时候,容器中的所有Bean对象也会随之创建,并且Bean标签就等同于new 一个Bean对象,会在创建的Bean对象的时候,调用其无参构造。
Bean的创建顺序是按照xml中配置顺序创建的
Spring 给Bean属性注入null值
在容器中注册一个组件(Bean标签就是组件的注册,等同于new一个Bean对象)时,同一个组件(对象)默认是单例的,容器启动完成,容器中所有组件创建完毕
IOC容器在创建组件对象的时候,如果使用Property标签对属性进行赋值,那么默认利用对象的setter属性进行赋值
javaBean对象的属性名由对象的setter方法,去掉set后面,后面的那一串首字母小写就是属性名
getBean方法的三个重置版本
getBean(people.class);//类型查找
getBean("people01");//ID查找
getBean("people01",people.class);//ID加类型查找
单例情况下演示:
<bean id="userDao" class="com.impl.UserDaoImpl" scope="singleton"></bean>
多例演示:
<bean id="userDao" class="com.impl.UserDaoImpl" scope="prototype"></bean>
多例模式每一次获取的对象都不相同
注意
Bean(对象)的生命周期配置
UserDaoImpl类:
package com.impl;
import com.UserDao;
public class UserDaoImpl implements UserDao {
@Override
public void say() {
System.out.println("用户登录");
}
void init()
{
System.out.println("初始化中...");
}
void destory()
{
System.out.println("被销毁中....");
}
}
配置文件:
<bean id="userDao" class="com.impl.UserDaoImpl" init-method="init" destroy-method="destory" ></bean>
测试类:
public class testDemo {
public static void main(String[] args) {
ApplicationContext app=new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao = (UserDao) app.getBean("userDao");
System.out.println(userDao);
//需要强转成其子类,才能调用close方法,来关闭容器
((ClassPathXmlApplicationContext)app).close();
}
}
容器没有关闭,所以对象没有被释放,也就不会去调用销毁方法
单例Bean的生命周期: (容器启动)构造器------>初始化方法---->容器关闭(销毁方法)
多例Bean的生命周期: 获取Bean(构造器---->初始化方法)---->容器关闭不会调用Bean的销毁方法
后置处理器----在Bean初始化前面调用该方法
单例:(容器启动)构造器—>后置处理器before---->初始化方法---->后置处理器的after方法----》容器关闭(销毁方法)
无论bean是否有初始化方法,后置处理器都会默认其有,还会继续工作
//1.编写后置处理器的实现类
//2.将后置处理器注册在配置文件中
public class MyBeansProcess implements BeanPostProcessor {
//初始化之前调用
//Object bean: 将要初始化的bean
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println(beanName+"Bean将要调用初始化方法"+" "+bean);
return bean;//返回传入的bean
}
//String beanName: bean在xml中配置的id
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println(beanName+"Bean初始化方法调用完毕"+" "+bean);
//初始化之后返回的是什么,容器中保存的就是什么
return bean;
}
}
配置文件:
<bean id="book" class="com.dhy.Factory.book"/>
<bean id="beanPostProcess" class="com.dhy.Factory.MyBeansProcess"/>
book类;
public class book {
book()
{
System.out.println("book的初始化方法");
}
@Override
public String toString() {
return "图书";
}
}
测试类:
public class main {
public static void main(String[] args) {
ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("factory.xml");
System.out.println(app.getBean("book"));
if(app.getBean("book")!=null)
System.out.println("NO");
else
System.out.println("YES");
}
}
Bean(对象)实例化的三种方式
工厂静态方法实例化Bean(对象)—返回的是Bean对象,而不是工厂对象
工厂类:
public class s以上是关于Spring入门的主要内容,如果未能解决你的问题,请参考以下文章
初识Spring源码 -- doResolveDependency | findAutowireCandidates | @Order@Priority调用排序 | @Autowired注入(代码片段
Spring boot:thymeleaf 没有正确渲染片段
What's the difference between @Component, @Repository & @Service annotations in Spring?(代码片段
spring练习,在Eclipse搭建的Spring开发环境中,使用set注入方式,实现对象的依赖关系,通过ClassPathXmlApplicationContext实体类获取Bean对象(代码片段