Spring(一)(spring一级缓存二级缓存和三级缓存的区别)

  本篇文章为你整理了Spring(一)(spring一级缓存二级缓存和三级缓存的区别)的详细内容,包含有spring英语作文 spring一级缓存二级缓存和三级缓存的区别 spring要大写吗 spring过去式过去分词 Spring(一),希望能帮助你了解 Spring(一)。

  1.1.1 jar

  

 properties 

 

   project.build.sourceEncoding UTF-8 /project.build.sourceEncoding

   spring.version 4.3.18.RELEASE /spring.version

   lombok.version 1.16.18 /lombok.version

   junit.version 4.11 /junit.version

   /properties

   dependencies

   !-- spring-beans begin --

   dependency

   groupId org.springframework /groupId

   artifactId spring-beans /artifactId

   version ${spring.version} /version

   /dependency

   !-- spring-beans end --

   !-- spring-core begin --

   dependency

   groupId org.springframework /groupId

   artifactId spring-core /artifactId

   version ${spring.version} /version

   /dependency

   !-- spring-core end --

   !-- spring-context begin --

   dependency

   groupId org.springframework /groupId

   artifactId spring-context /artifactId

   version ${spring.version} /version

   /dependency

   !-- spring-context end --

   !-- spring-expression begin --

   dependency

   groupId org.springframework /groupId

   artifactId spring-expression /artifactId

   version ${spring.version} /version

   /dependency

   !-- spring-expression end --

   /dependencies

  

 

  1.1.2 application.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"

   !-- 基于spring的核心配置文件方式,手动配置一个bean,放到spring的容器中 --

   bean id="userOne"

   property name="nickName" value="kh96_spring_one" /property

   /bean

   /beans

  

 

   bean 标签:定义一个实例对象,会自动被创建 并 交给spring容器进行管理:

  
id 属性:被spring容器进行管理的实例的 唯一标识,整个容器中,只能是唯一的(不可重复);

  
class属性:指定创建当前实例对象的类型(全类名),spring底层是使用的 反射机制 ,根据指定的目标类型,创建目标实例(必须有 空参构造)

  
public void testSpringPrimer(){

   //1.创建spring的核心容器对象(引用上下文对象),解析spring的核心配置文件,将文件中的bean标签进行实例化(创建对象并赋值)

   ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

   //2. 写法一: 从容器中获取实例对象,根据核心配置文件中,配置的bean标签的id属性值

   // 不足:强制转化,容易出现转换错误

   User userOne = (User) context.getBean("userOne");

   userOne.sayHello();

   //对比以前创建对象的写法(对象必须手动new创建,并手动赋值)

   User userOld = new User();

   userOld.setNickName("kh96_old");

   userOld.sayHello();

  

 

 

  1.1.4 总结

  通过id属性,获取实例对象后需要强制转换,容易出现强制转化错误;

  1.2 class 属性

  1.2.1 测试

  

//写法二:从容器中获取实例对象,根据核心配置文件中,配置的bean标签的class属性指定的目标类型

 

  User userTwo = context.getBean(User.class);

  userTwo.sayHello();

  

 

  1.2.2 总结

  不足:如果存在同类型的多个实例,会报异常;

  1.2.2.1 application.xml

  当用多个同类型的实例:

  

...

 

   bean id="userOne"

   property name="nickName" value="kh96_spring_one" /property

   /bean

   !-- Configuration problem: Bean name userOne is already used in this beans element --

   bean id="userTwo"

   property name="nickName" value="kh96_spring_two" /property

   /bean

  

 

  1.2.2.2 测试

  

User userTwo = context.getBean(User.class);

 

  

 

  会发生异常:

  NoUniqueBeanDefinitionException: No qualifying bean of type com.kgc.spring.bean.User available: expected single matching bean but found 2: userOne,userTwo

  主要原因是由于只用class属性去获取实例,但是有多个相同类型的实例,所以无法确定你要获取的是哪一个;

  1.3 id 属性 和 class 属性 (推荐)

  1.3.1 测试

  

//写法三:从容器中获取实例对象,根据配置文件中,配置的bean标签的id属性值和class属性指定的目标类型

 

   User userTwoThree = context.getBean("userTwo", User.class);

  

 

  1.3.2 总结

  能够确定唯一实例,推荐使用;

  1.4 id 不能重复注意点

  配置文件中的id必须是唯一的;

  如果id不唯一:两个id一样的实例

  

...

 

   bean id="userOne"

   property name="nickName" value="kh96_spring_one" /property

   /bean

   bean id="userOne"

   property name="nickName" value="kh96_spring_one" /property

   /bean

  

 

  报错:

  BeanDefinitionParsingException: Configuration problem: Bean name userOne is already used in this beans element

  提示 id 为 userOne 的实例已经存在;

  1.5 实例化时机

  当初始化spring的容器对象时,会将核心配置文件中所有的bean实例化,不是使用哪个,创建哪个;

  IOC(控制反转是一种思想),DI是IOC的一种实现方式;

  2.1 set 方式注入

  2.1.1 实体

  

@Data

 

  @AllArgsConstructor

  @NoArgsConstructor

  public class User {

   //用户昵称

   //普通参数

   private String nickName;

   //私家车

   //实体参数

   private Car car;

   //喜欢的书

   //数组参数

   private String[] books;

   //爱好

   //list集合参数

   private List String hobbies;

   //喜欢的游戏

   //set 集合

   private Set String games;

   //卡包

   //map参数

   private Map String,String cards;

   //在校信息

   //properties参数

   private Properties info;

   //是否有女朋友 (主要是演示赋值为null,其他类型都可以)

   //空参数注入

   private Boolean wife;

  

 

  2.1.2 参数 注入

  

...

 

   !-- 不同类型参数的set注入 --

   bean id="user01"

   !-- 1.普通参数 注入 --

   property name="nickName" value="小气鬼" /property

   !-- 2.实体参数 注入 --

   !-- 2.1 实体参数 注入方式一 外部引入 ref --

   !-- property name="car" ref="carOne" /property --

   property name="car"

   !-- 2.2 实体参数注入方式二 内部注入 bean --

   bean

   property name="brand" value="Bmw325" /property

   property name="factory" value="华晨" /property

   property name="price" value="300000" /property

   /bean

   /property

   !-- 3.数组参数 注入 --

   property name="books"

   array

   value 红楼梦 /value

   value 水浒传 /value

   value 三国演义 /value

   value 西游记 /value

   /array

   /property

   !-- 4.list集合参数 --

   property name="hobbies"

   list

   value 跑步 /value

   value 尤克里里 /value

   value 敲代码 /value

   /list

   /property

   !-- 5.set 集合参数 注入 --

   property name="games"

   set

   value 唱歌 /value

   value 跳舞 /value

   value 喝酒 /value

   /set

   /property

   !-- 6.map参数 --

   property name="cards"

   map

   entry key="身份证" value="1212121212121212" /entry

   entry key="银行卡" value="1111111111111111" /entry

   /map

   /property

   !-- 7.properties参数 --

   property name="info"

   props

   prop key="学号" 123456 /prop

   prop key="性别" 男 /prop

   prop key="姓名" 化羽 /prop

   /props

   /property

   !-- 8.空参数注入 --

   property name="wife"

   null /null

   /property

   /bean

  
property name="brand" value="Bmw325" /property

   property name="factory" value="华晨" /property

   property name="price" value="300000" /property

   /bean

  

 

  2.1.3 测试

  

@Test

 

  public void testPramsDI(){

   User user01 = context.getBean("user01", User.class);

   //输入对象详情

   System.out.println(user01);

  

 

  输出结果:

  

User(

 

   nickName=小气鬼,

   car=Car(brand=Bmw325, factory=华晨, price=300000.0),

   books=[红楼梦, 水浒传, 三国演义, 西游记],

   hobbies=[跑步, 尤克里里, 敲代码],

   games=[唱歌, 跳舞, 喝酒],

   cards={身份证=1212121212121212, 银行卡=1111111111111111},

   info={学号=1913001072, 性别=男, 姓名=化羽},

   wife=null

  

 

  2.2 Constructor 构造器注入

  2.2.1 按照默认顺序 注入

  2.2.1.1 参数注入

  

 !--

 

  实体构造方法:Car(String brand, String factory, Double price)

   !-- 构造器注入:通过构造方法,默认是按照构造方法的参数定义顺序赋值 --

   bean id="carTwo"

   constructor-arg value="AudiA4" /constructor-arg

   constructor-arg value="一汽" /constructor-arg

   constructor-arg value="320000" /constructor-arg

   /bean

  

 

  2.2.1.2 测试

  

@Test

 

  public void testSpringDIConstructor(){

   Car carTwo = context.getBean("carTwo", Car.class);

   //输出对象详情

   System.out.println(carTwo);

  

 

  2.2.2 根据 参数的下标 和 类型 注入

  2.2.2.1 参数注入

  

 !-- 根据构造器中参数的下标 和 类型 赋值 -- 

 

   bean id="carThree"

   constructor-arg index="0" value="BenzC200" /constructor-arg

   constructor-arg index="1" value="北京" /constructor-arg

   constructor-arg index="2" type="java.lang.Double" value="350000" /constructor-arg

   !--

  如果参数列表中,该类型的参数只用一个,也可以只指定参数类型

   constructor-arg type="java.lang.Double" value="350000" /constructor-arg

   /bean

  

 

  2.2.2.2 测试

  

@Test

 

  public void testSpringDIConstructor2(){

   Car carTwo = context.getBean("carThree", Car.class);

   //输入对象详情

   System.out.println(carTwo);

  

 

  2.3 自定义 实体工厂bean

  自定义实体工厂bean ,必须实现FactoryBean接口;

  普通bean 与 工厂bean 的区别:

  普通 bean:在配置文件中定义 bean 类型 就是 返回类型

  工厂 bean:在配置文件定义 bean 类型 和 返回类型 不一样

  2.3.1 返回bean

  

@Data

 

  @ToString

  public class Car {

   private String brand;

   private String factory;

   private Double price;

  

 

  2.3.2 实体工厂 bean

  在spring容器初始化时,创建当前工厂bean的实例对象,但是真实返回的不是当前类的实例对象,而是当前类的实例对象返回的目标实例对象(自定义);

  作用:可以在程序中,实现自定义创建实例(还可以增加业务逻辑处理),放入容器;

  存在的原因:spring框架对外开放了一个入口,可以让其他的开发人员参与到spring底层创建bean的实例过程中去,给整合其他框架使用的,比如mybatis;

  

public class CarFactoryBean implements FactoryBean Car {

 

   @Override

   public Car getObject() throws Exception {

   System.out.println("通过CarFactoryBean的实例对象的getObject方法:返回一个自定义的car的实例");

   return new Car("Byd唐","南京",2500000.0);

   @Override

   public Class ? getObjectType() {

   //指定给Object方法返回的目标类型

   return Class.class;

   @Override

   public boolean isSingleton() {

   //是否单例

   return false;

  

 

  2.3.3 工厂bean容器中添加自定义实例对象

  

...

 

   !-- 使用工厂bean容器,添加自定义实例对象 --

   bean id="carFactoryBean" /bean

  

 

  2.3.4 测试

  

@Test

 

  public void testSpringFactoryBean(){

   //从容器中获取工厂bean的实例对象

   Car car1 = context.getBean("carFactoryBean", Car.class);

   Car car2 = context.getBean("carFactoryBean", Car.class);

   //输出对象详情

   System.out.println(car 1);

   //在容器中添加的实例是 CarFactoryBean 类型,返回的是

   //Car(brand=Byd唐, factory=南京, price=2500000.0)

   System.out.println("car1 == car2 : " + ( car1 == car2));

   //false 说明工厂bean是多例的

  

 

  3、scope 作用域

  singleton 单例 (默认) 容器初始化之前创建;

  prototype 多例 (手动设置) 使用到的时候才创建;

  3.1 singleton 单例

  这里区别于,整个程序运行期间,有且只有唯一的实例(单例模式-懒汉和饿汉);

  容器中bean的单例,不是指当前类的实例在容器中,只有唯一的实例,而是当创建bean的实例时,此实例是单例(容器内唯一),但是同一个类的实例,容器中可以创建多个,每个都是单例的;

  3.1.1 配置bean

  

 !-- scope="singleton" 不写默认也是单例的 -- 

 

   bean id="busTwo" scope="singleton"

   property name="brand" value="金龙2" /property

   property name="factory" value="厦门2" /property

   property name="price" value="1200000" /property

   /bean

  

 

  3.1.2 测试

  

@Test

 

  public void testScopeSingleton(){

   //从容器中,获取Bus的实例对象

   Bus busThree = context.getBean("busTwo", Bus.class);

   Bus busFour = context.getBean("busTwo", Bus.class);

   System.out.println(busThree);

   System.out.println(busFour);

   System.out.println("singleton busThree == busFour:"+(busThree == busFour));

   //true

  

 

  3.2 prototype 多例

  多例:prototype,不是spring容器中的默认作用,需要单独指定;

  spring容器创建时,不会自动创建指定作用域为多例的bean的实例,而是每次通过getBean方法,获取bean的实例,才会创建bean的实例;

  3.2.1 配置bean

  

 !-- scope="prototype" 多例需要手动设置 -- 

 

   bean id="busThree" scope="prototype"

   property name="brand" value="中通3" /property

   property name="factory" value="山东3" /property

   property name="price" value="1200000" /property

   /bean

  

 

  3.2.2 测试

  

@Test

 

  public void testScopePrototype(){

   Bus busOne = context.getBean("busThree", Bus.class);

   Bus busTwo = context.getBean("busThree", Bus.class);

   //输入详情

   System.out.println(busOne);

   System.out.println(busTwo);

   System.out.println("prototype busOne == busTwo:"+(busOne == busTwo));

   //false

  

 

  以上就是Spring(一)(spring一级缓存二级缓存和三级缓存的区别)的详细内容,想要了解更多 Spring(一)的内容,请持续关注盛行IT软件开发工作室。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: