Spring(一)- 初始 + DI+scope

打印 上一主题 下一主题

主题 938|帖子 938|积分 2814

1、获取bean实例的三种方式

1.1  id 属性

1.1.1 jar

  1. <properties>
  2.     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  3.     <spring.version>4.3.18.RELEASE</spring.version>
  4.     <lombok.version>1.16.18</lombok.version>
  5.     <junit.version>4.11</junit.version>
  6. </properties>
  7. <dependencies>
  8.    
  9.     <dependency>
  10.         <groupId>org.springframework</groupId>
  11.         <artifactId>spring-beans</artifactId>
  12.         <version>${spring.version}</version>
  13.     </dependency>
  14.    
  15.    
  16.     <dependency>
  17.         <groupId>org.springframework</groupId>
  18.         <artifactId>spring-core</artifactId>
  19.         <version>${spring.version}</version>
  20.     </dependency>
  21.    
  22.    
  23.     <dependency>
  24.         <groupId>org.springframework</groupId>
  25.         <artifactId>spring-context</artifactId>
  26.         <version>${spring.version}</version>
  27.     </dependency>
  28.    
  29.    
  30.     <dependency>
  31.         <groupId>org.springframework</groupId>
  32.         <artifactId>spring-expression</artifactId>
  33.         <version>${spring.version}</version>
  34.     </dependency>
  35.    
  36. </dependencies>
复制代码
1.1.2 application.xml
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  5.    
  6.     <bean id="userOne" >
  7.         <property name="nickName" value="kh96_spring_one"></property>
  8.     </bean>
  9. </beans>
复制代码
标签:定义一个实例对象,会自动被创建 并 交给spring容器进行管理:

  • id 属性:被spring容器进行管理的实例的 唯一标识,整个容器中,只能是唯一的(不可重复);
  • class属性:指定创建当前实例对象的类型(全类名),spring底层是使用的 反射机制 ,根据指定的目标类型,创建目标实例(必须有 空参构造)
  • 子标签:给当前创建对象的属性值

    • name:指定对象的属性名
    • value: 给属性赋值

1.1.3 测试
  1. @Test
  2. public void testSpringPrimer(){
  3.     //1.创建spring的核心容器对象(引用上下文对象),解析spring的核心配置文件,将文件中的bean标签进行实例化(创建对象并赋值)
  4.     ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
  5.     //2. 写法一: 从容器中获取实例对象,根据核心配置文件中,配置的bean标签的id属性值
  6.     //<bean id="carTwo" >
  7.     <constructor-arg value="AudiA4"></constructor-arg>
  8.     <constructor-arg value="一汽"></constructor-arg>
  9.     <constructor-arg value="320000"></constructor-arg>
  10. </bean>不足:强制转化,容易出现转换错误
  11.     User userOne = (User) context.getBean("userOne");
  12.    
  13.     userOne.sayHello();
  14.     //对比以前创建对象的写法(对象必须手动new创建,并手动赋值)
  15.     User userOld = new User();
  16.     userOld.setNickName("kh96_old");
  17.     userOld.sayHello();
  18.      
  19. }
复制代码
1.1.4 总结

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

1.2.1 测试
  1. //写法二:从容器中获取实例对象,根据核心配置文件中,配置的bean标签的class属性指定的目标类型
  2. User userTwo = context.getBean(User.class);
  3. userTwo.sayHello();
复制代码
1.2.2 总结

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

当用多个同类型的实例:
  1. ...
  2. <bean id="userOne" >
  3.     <property name="nickName" value="kh96_spring_one"></property>
  4. </bean>
  5. <bean id="userTwo" >
  6.     <property name="nickName" value="kh96_spring_two"></property>
  7. </bean>
  8. ...
复制代码
1.2.2.2 测试
  1. 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 测试
  1. //写法三:从容器中获取实例对象,根据配置文件中,配置的bean标签的id属性值和class属性指定的目标类型
  2. User userTwoThree = context.getBean("userTwo", User.class);
复制代码
1.3.2 总结

能够确定唯一实例,推荐使用;
1.4 id 不能重复注意点

配置文件中的id必须是唯一的;
如果id不唯一:两个id一样的实例
  1. ...
  2. <bean id="userOne" >
  3.     <property name="nickName" value="kh96_spring_one"></property>
  4. </bean>
  5. <bean id="userTwo" >
  6.     <property name="nickName" value="kh96_spring_two"></property>
  7. </bean>
  8. ...
复制代码
报错:
BeanDefinitionParsingException: Configuration problem: Bean name 'userOne' is already used in this  element
提示 id 为 userOne 的实例已经存在;
1.5 实例化时机

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

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

2.1.1 实体
  1. @Data
  2. @AllArgsConstructor
  3. @NoArgsConstructor
  4. public class User {
  5.     //用户昵称
  6.     //普通参数
  7.     private String nickName;
  8.     //私家车
  9.     //实体参数
  10.     private Car car;
  11.     //喜欢的书
  12.     //数组参数
  13.     private String[] books;
  14.     //爱好
  15.     //list集合参数
  16.     private List<String> hobbies;
  17.     //喜欢的游戏
  18.     //set 集合
  19.     private Set<String> games;
  20.     //卡包
  21.     //map参数
  22.     private Map<String,String> cards;
  23.     //在校信息
  24.     //properties参数
  25.     private Properties info;
  26.     //是否有女朋友 (主要是演示赋值为null,其他类型都可以)
  27.     //空参数注入
  28.     private Boolean wife;
  29. }
复制代码
2.1.2  参数 注入
  1. ...<?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  5.    
  6.     <bean id="userOne" >
  7.         <property name="nickName" value="kh96_spring_one"></property>
  8.     </bean>
  9. </beans><?xml version="1.0" encoding="UTF-8"?>
  10. <beans xmlns="http://www.springframework.org/schema/beans"
  11.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  12.        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  13.    
  14.     <bean id="userOne" >
  15.         <property name="nickName" value="kh96_spring_one"></property>
  16.     </bean>
  17. </beans><?xml version="1.0" encoding="UTF-8"?>
  18. <beans xmlns="http://www.springframework.org/schema/beans"
  19.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  20.        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  21.    
  22.     <bean id="userOne" >
  23.         <property name="nickName" value="kh96_spring_one"></property>
  24.     </bean>
  25. </beans><?xml version="1.0" encoding="UTF-8"?>
  26. <beans xmlns="http://www.springframework.org/schema/beans"
  27.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  28.        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  29.    
  30.     <bean id="userOne" >
  31.         <property name="nickName" value="kh96_spring_one"></property>
  32.     </bean>
  33. </beans><?xml version="1.0" encoding="UTF-8"?>
  34. <beans xmlns="http://www.springframework.org/schema/beans"
  35.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  36.        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  37.    
  38.     <bean id="userOne" >
  39.         <property name="nickName" value="kh96_spring_one"></property>
  40.     </bean>
  41. </beans><bean id="carTwo" >
  42.     <constructor-arg value="AudiA4"></constructor-arg>
  43.     <constructor-arg value="一汽"></constructor-arg>
  44.     <constructor-arg value="320000"></constructor-arg>
  45. </bean>     红楼梦<bean id="carTwo" >
  46.     <constructor-arg value="AudiA4"></constructor-arg>
  47.     <constructor-arg value="一汽"></constructor-arg>
  48.     <constructor-arg value="320000"></constructor-arg>
  49. </bean>水浒传<bean id="carTwo" >
  50.     <constructor-arg value="AudiA4"></constructor-arg>
  51.     <constructor-arg value="一汽"></constructor-arg>
  52.     <constructor-arg value="320000"></constructor-arg>
  53. </bean>三国演义<bean id="carTwo" >
  54.     <constructor-arg value="AudiA4"></constructor-arg>
  55.     <constructor-arg value="一汽"></constructor-arg>
  56.     <constructor-arg value="320000"></constructor-arg>
  57. </bean>西游记<?xml version="1.0" encoding="UTF-8"?>
  58. <beans xmlns="http://www.springframework.org/schema/beans"
  59.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  60.        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  61.    
  62.     <bean id="userOne" >
  63.         <property name="nickName" value="kh96_spring_one"></property>
  64.     </bean>
  65. </beans><?xml version="1.0" encoding="UTF-8"?>
  66. <beans xmlns="http://www.springframework.org/schema/beans"
  67.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  68.        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  69.    
  70.     <bean id="userOne" >
  71.         <property name="nickName" value="kh96_spring_one"></property>
  72.     </bean>
  73. </beans>跑步<bean id="carTwo" >
  74.     <constructor-arg value="AudiA4"></constructor-arg>
  75.     <constructor-arg value="一汽"></constructor-arg>
  76.     <constructor-arg value="320000"></constructor-arg>
  77. </bean>尤克里里<bean id="carTwo" >
  78.     <constructor-arg value="AudiA4"></constructor-arg>
  79.     <constructor-arg value="一汽"></constructor-arg>
  80.     <constructor-arg value="320000"></constructor-arg>
  81. </bean>敲代码<?xml version="1.0" encoding="UTF-8"?>
  82. <beans xmlns="http://www.springframework.org/schema/beans"
  83.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  84.        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  85.    
  86.     <bean id="userOne" >
  87.         <property name="nickName" value="kh96_spring_one"></property>
  88.     </bean>
  89. </beans><?xml version="1.0" encoding="UTF-8"?>
  90. <beans xmlns="http://www.springframework.org/schema/beans"
  91.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  92.        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  93.    
  94.     <bean id="userOne" >
  95.         <property name="nickName" value="kh96_spring_one"></property>
  96.     </bean>
  97. </beans>唱歌<bean id="carTwo" >
  98.     <constructor-arg value="AudiA4"></constructor-arg>
  99.     <constructor-arg value="一汽"></constructor-arg>
  100.     <constructor-arg value="320000"></constructor-arg>
  101. </bean>跳舞<bean id="carTwo" >
  102.     <constructor-arg value="AudiA4"></constructor-arg>
  103.     <constructor-arg value="一汽"></constructor-arg>
  104.     <constructor-arg value="320000"></constructor-arg>
  105. </bean>喝酒<?xml version="1.0" encoding="UTF-8"?>
  106. <beans xmlns="http://www.springframework.org/schema/beans"
  107.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  108.        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  109.    
  110.     <bean id="userOne" >
  111.         <property name="nickName" value="kh96_spring_one"></property>
  112.     </bean>
  113. </beans><?xml version="1.0" encoding="UTF-8"?>
  114. <beans xmlns="http://www.springframework.org/schema/beans"
  115.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  116.        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  117.    
  118.     <bean id="userOne" >
  119.         <property name="nickName" value="kh96_spring_one"></property>
  120.     </bean>
  121. </beans><?xml version="1.0" encoding="UTF-8"?>
  122. <beans xmlns="http://www.springframework.org/schema/beans"
  123.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  124.        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  125.    
  126.     <bean id="userOne" >
  127.         <property name="nickName" value="kh96_spring_one"></property>
  128.     </bean>
  129. </beans><?xml version="1.0" encoding="UTF-8"?>
  130. <beans xmlns="http://www.springframework.org/schema/beans"
  131.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  132.        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  133.    
  134.     <bean id="userOne" >
  135.         <property name="nickName" value="kh96_spring_one"></property>
  136.     </bean>
  137. </beans><bean id="carTwo" >
  138.     <constructor-arg value="AudiA4"></constructor-arg>
  139.     <constructor-arg value="一汽"></constructor-arg>
  140.     <constructor-arg value="320000"></constructor-arg>
  141. </bean>123456<bean id="carTwo" >
  142.     <constructor-arg value="AudiA4"></constructor-arg>
  143.     <constructor-arg value="一汽"></constructor-arg>
  144.     <constructor-arg value="320000"></constructor-arg>
  145. </bean>男<bean id="carTwo" >
  146.     <constructor-arg value="AudiA4"></constructor-arg>
  147.     <constructor-arg value="一汽"></constructor-arg>
  148.     <constructor-arg value="320000"></constructor-arg>
  149. </bean>化羽<?xml version="1.0" encoding="UTF-8"?>
  150. <beans xmlns="http://www.springframework.org/schema/beans"
  151.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  152.        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  153.    
  154.     <bean id="userOne" >
  155.         <property name="nickName" value="kh96_spring_one"></property>
  156.     </bean>
  157. </beans><?xml version="1.0" encoding="UTF-8"?>
  158. <beans xmlns="http://www.springframework.org/schema/beans"
  159.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  160.        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  161.    
  162.     <bean id="userOne" >
  163.         <property name="nickName" value="kh96_spring_one"></property>
  164.     </bean>
  165. </beans>    ...
复制代码
2.1.3 测试
  1. @Test
  2. public void testPramsDI(){
  3.     User user01 = context.getBean("user01", User.class);
  4.     //输入对象详情
  5.     System.out.println(user01);
  6. }
复制代码
输出结果:
  1. User(
  2.      nickName=小气鬼,
  3.      car=Car(brand=Bmw325, factory=华晨, price=300000.0),
  4.      books=[红楼梦, 水浒传, 三国演义, 西游记],
  5.      hobbies=[跑步, 尤克里里, 敲代码],
  6.      games=[唱歌, 跳舞, 喝酒],
  7.      cards={身份证=1212121212121212, 银行卡=1111111111111111},
  8.      info={学号=1913001072, 性别=男, 姓名=化羽},
  9.      wife=null
  10.     )
复制代码
2.2  Constructor 构造器注入

2.2.1 按照默认顺序 注入

2.2.1.1 参数注入
  1. <bean id="carTwo" >
  2.     <constructor-arg value="AudiA4"></constructor-arg>
  3.     <constructor-arg value="一汽"></constructor-arg>
  4.     <constructor-arg value="320000"></constructor-arg>
  5. </bean>
复制代码
2.2.1.2 测试
  1. @Test
  2. public void testSpringDIConstructor(){
  3.     Car carTwo = context.getBean("carTwo", Car.class);
  4.     //输出对象详情
  5.     System.out.println(carTwo);
  6. }
复制代码
2.2.2  根据 参数的下标 和 类型 注入

2.2.2.1 参数注入
  1. <bean id="carTwo" >
  2.     <constructor-arg value="AudiA4"></constructor-arg>
  3.     <constructor-arg value="一汽"></constructor-arg>
  4.     <constructor-arg value="320000"></constructor-arg>
  5. </bean>
复制代码
2.2.2.2 测试
  1. @Test
  2. public void testSpringDIConstructor2(){
  3.     Car carTwo = context.getBean("carThree", Car.class);
  4.     //输入对象详情
  5.     System.out.println(carTwo);
  6. }
复制代码
2.3 自定义 实体工厂bean

自定义实体工厂bean ,必须实现FactoryBean接口
普通bean 与  工厂bean 的区别:

  • 普通 bean:在配置文件中定义 bean 类型 就是 返回类型
  • 工厂 bean:在配置文件定义 bean 类型返回类型 不一样
2.3.1 返回bean
  1. @Data
  2. @ToString
  3. public class Car {
  4.     /*
  5.      品牌
  6.      */
  7.     private String brand;
  8.     /*
  9.     厂商
  10.      */
  11.     private String factory;
  12.     /*
  13.     价格
  14.      */
  15.     private Double price;
  16. }
复制代码
2.3.2 实体工厂 bean


  • spring容器初始化时,创建当前工厂bean的实例对象,但是真实返回不是当前类的实例对象而是当前类的实例对象返回的目标实例对象(自定义);
  • 作用:可以在程序中,实现自定义创建实例(还可以增加业务逻辑处理),放入容器;
  • 存在的原因:spring框架对外开放了一个入口,可以让其他的开发人员参与到spring底层创建bean的实例过程中去给整合其他框架使用的,比如mybatis;
  1. public class CarFactoryBean implements FactoryBean<Car> {
  2.     @Override
  3.     public Car getObject() throws Exception {
  4.         System.out.println("通过CarFactoryBean的实例对象的getObject方法:返回一个自定义的car的实例");
  5.         return new Car("Byd唐","南京",2500000.0);
  6.     }
  7.     @Override
  8.     public Class<?> getObjectType() {
  9.         //指定给Object方法返回的目标类型
  10.         return Class.class;
  11.     }
  12.     @Override
  13.     public boolean isSingleton() {
  14.         //是否单例
  15.         return false;
  16.     }
  17. }
复制代码
2.3.3  工厂bean容器中添加自定义实例对象
  1. ...
  2. <bean id="carFactoryBean" ></bean>
  3. ...
复制代码
2.3.4 测试
  1. @Test
  2. public void testSpringFactoryBean(){
  3.     //从容器中获取工厂bean的实例对象
  4.     Car car1 = context.getBean("carFactoryBean", Car.class);
  5.     Car car2 = context.getBean("carFactoryBean", Car.class);
  6.     //输出对象详情
  7.     System.out.println(car 1);
  8.     //在容器中添加的实例是  CarFactoryBean 类型,返回的是
  9.     //Car(brand=Byd唐, factory=南京, price=2500000.0)
  10.     System.out.println("car1 == car2 : " + ( car1 == car2));
  11.     //false  说明工厂bean是多例的
  12. }
复制代码
3、scope作用域


  • singleton 单例 (默认)  容器初始化之前创建;
  • prototype 多例 (手动设置) 使用到的时候才创建;
3.1 singleton 单例

这里区别于整个程序运行期间有且只有唯一的实例(单例模式-懒汉和饿汉);
容器中bean的单例不是指当前类的实例在容器中,只有唯一的实例,而是当创建bean的实例时,此实例是单例(容器内唯一),但是同一个类的实例,容器中可以创建多个每个都是单例的
3.1.1 配置bean
  1. <bean id="carTwo" >
  2.     <constructor-arg value="AudiA4"></constructor-arg>
  3.     <constructor-arg value="一汽"></constructor-arg>
  4.     <constructor-arg value="320000"></constructor-arg>
  5. </bean>
复制代码
3.1.2 测试
  1. @Test
  2. public void testScopeSingleton(){
  3.    
  4.     //从容器中,获取Bus的实例对象
  5.     Bus busThree = context.getBean("busTwo", Bus.class);
  6.     Bus busFour = context.getBean("busTwo", Bus.class);
  7.     System.out.println(busThree);
  8.     System.out.println(busFour);
  9.     System.out.println("singleton busThree == busFour:"+(busThree == busFour));
  10.         //true
  11. }
复制代码
3.2 prototype 多例

多例:prototype,不是spring容器中的默认作用,需要单独指定
spring容器创建时,不会自动创建指定作用域为多例的bean的实例,而是每次通过getBean方法获取bean的实例,才会创建bean的实例
3.2.1 配置bean
  1. <bean id="carTwo" >
  2.     <constructor-arg value="AudiA4"></constructor-arg>
  3.     <constructor-arg value="一汽"></constructor-arg>
  4.     <constructor-arg value="320000"></constructor-arg>
  5. </bean>
复制代码
3.2.2 测试
  1. @Test
  2. public void testScopePrototype(){
  3.     Bus busOne = context.getBean("busThree", Bus.class);
  4.     Bus busTwo = context.getBean("busThree", Bus.class);
  5.     //输入详情
  6.     System.out.println(busOne);
  7.     System.out.println(busTwo);
  8.     System.out.println("prototype busOne == busTwo:"+(busOne == busTwo));
  9.     //false
  10. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

西河刘卡车医

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表