helloworld

  1. 添加spring依赖

    1. <dependencies>
    2. <dependency>
    3. <groupId>org.springframework</groupId>
    4. <artifactId>spring-context</artifactId>
    5. <version>5.2.9.RELEASE</version>
    6. </dependency>
    7. <dependency>
    8. <groupId>junit</groupId>
    9. <artifactId>junit</artifactId>
    10. <version>4.12</version>
    11. </dependency>
    12. </dependencies>
  2. 创建实体类

  3. 在resources资源目录下添加applicationContext.xml配置文件,进行实体类对象的创建,由spring创建与管理 ```xml <?xml version=”1.0” encoding=”UTF-8”?>


4. 在测试方法中,获取实体类对象
   1. 获取ClassPathXmlApplicationContext对象
   1. 通过该对象getBean()方法获取实体类对象
   1. 通过实体类对象调用方法
```java
public class SpringTest01 { 
    @Test
    public void testSpringHello(){ 
        //创建一个spring容器 
        ApplicationContext context = 
        new ClassPathXmlApplicationContext("applicationContext.xml"); 
        //从容器中取出service对象 
        UserService userService = (UserService) context.getBean("userService"); 
        userService.save("旗木卡卡西"); 
    } 
}

分析spring创建对象

set注入

set注入是通过类的set方法对属性进行赋值操作的方式,如果需要赋值的成员变量没有set方法,那么它就不是一个属性,就不能进行set注入。
image.png
可以理解为一个bean就是一个对象。
id:这个对象的应用
class:类的全限定类名,表示创建这个类的对象
property:这个标签表示对象的一个属性(属性可以理解为拥有set方法的成员变量,spring通过set方法进行注入值,这种方式也叫set注入)
name:属性名
value:属性值

构造注入

构造注入是通过类的有参构造方法进行赋值操作的方式。如果这个类没有相应的有参构造方法就不能进行构造注入
image.png
constructor-arg:这个标签表示使用构造注入,name是参数名,value是参数值
index:表示当前参数的索引,不需要使用参数名,根据该参数在构造函数的位置就可以进行赋值,配合value标签使用
ref:表示引用类型的注入,ref的值是另一个对象引用。

bean一些常用的属性介绍

id:对象的引用,不可重复,bean的唯一标志,非必须,不能以数字开头,不能有特殊符号
class:类的全限定类名。非必须。主要是通过反射技术来创建对象的
name:bean的唯一标志。不能重复,不能以数字开头,可以有特殊符号,一个name可以配多个名字
image.png
scope:这个属性是用来配置当前bean是否单例。singleton表示单例,prototype表示多例。

  • <bean id="userDAO" scope="prototype" class="com.st.dao.impl.UserDAOImpl"/>
  • 单例代表这个bean不是线程安全的,多例是线程安全的。
  • scope有五个值
    • singleton:单例,spring在初始化时,直接将这个类对象创建出来
    • prototype:多例,spring初始化不创建类对象,获取类对象的时候才创建一个新的对象。
    • request:一次请求中,web应用中偶尔用的
    • session:一次会话,购物车对象
    • application:web应用整个过程

init-method:指定初始化的方法,值是初始化方法的名字
destroy-method:指定销毁的方法,值是销毁方法的名字

  • springbean的生命周期
  • image.png
  • 创建spring容器时就会创建bean,执行init方法
  • new ClassPathXmlApplicationContexxt("配置文件名:一般都是applicationContext.xml");
  • 关闭spring容器时执行destroy方法
  • spring容器的引用.close();//关闭spring容器

factory-bean:表示引用一个工厂。值是工厂对象的引用
factory-method:表示调用工厂中创建bean的方法,值是工厂中创建对象的方法名

<!-- 配置UserDAO的工厂,自定义工厂,没有实现FactoryBean接口 --> 
<bean id="userDAOFactory" class="com.st.factory.UserDAOFactory"/> 
<!-- 通过工厂创建UserDAO,不要配置class --> 
<bean id="udao1" factory-bean="userDAOFactory" factory-method="createUserDAO"/>

我的理解:通过反射获取工厂类中创建UserDao对象的方法,invoke这个方法,获取bean。这个方法是被执行过的。

spring容器的整体架构(部分)

image.png

spring容器的获取方式

实际开发中,我们将不同内容的配置放在不同的配置文件中,从而会有多个配置文件,多个配置文件可以配合使用
创建容器的时候,同时传入多个配置文件:

@Test 
public void testContext1(){ 
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext- dao.xml","applicationContext-service.xml"); 
    UserService bean = applicationContext.getBean(UserService.class); 
    bean.save("旗木卡卡西"); }

配置文件名是字符串类型,所以也可以用字符数组的形式。new String[] {"applicationContext-dao.xml","applicationContext-service.xml"}

还可以通过ClassPathXmlApplicationContext的无参构造方法获取。

@Test public void testContenxt3(){ 
    //使用无参数的构造方法创建容器 
    ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext(); 
    //设置配置文件路径 
    applicationContext.setConfigLocations("applicationContext- dao.xml","applicationContext-service.xml"); 
    //加载对象 
    applicationContext.refresh(); 
    UserService bean = applicationContext.getBean(UserService.class); 
    bean.save("旗木卡卡西"); 
}

spring容器的常见api

getBean:

  • getBean(对象引用) //返回Object
  • getBean(对象引用,Class<?>) //返回类型安全的对象
  • getBean(Class<?>) //返回类型安全的对象,但是配置中不能有多个同类型的对象,不然spring找不到,报错

containsBean(对象引用) // 判断bean是否存在
isSingleton(对象引用) //判断bean是否单例

FactoryBean

BeanFactory是spring工厂的接口,定义了很多spring工厂的api。

FactoryBean是一个泛型的bean。可以通过FactoryBean来手动创建bean,与spring创建的bean不是同一个。

FactoryBean的使用:

  • 创建一个类,继承FactoryBean接口,实现接口的方法
  • 在接口的getObject()方法中创建我们要返回的对象
  • 通过配置文件配置这个类,我们再通过spring容器获取的bean。

    • 通过配置时的引用获取这个bean
    • 获取到的是getObject()方法中返回的bean,而不是继承了FactoryBean接口的这个类的bean

      public class CarFactory02 implements FactoryBean {
      public CarImpl getObject() throws Exception {
         CarImpl car = new CarImpl();
         car.setBrand("阿斯顿马丁");
         car.setPrice(2000000);
         car.setSport(false);
         return car;
      }
      
      public Class<?> getObjectType() {
         return Car.class;
      }
      }
      
      <bean id="carFactory02" class="com.quail.spring.work04.impl.CarFactory02" />
      
      @Test
      public void test3() throws Exception {
         // 通过容器获得的居然是getObject中返回的bean
         Car car = (CarImpl) context.getBean("carFactory02");
            car.run();
      }
      

      如果想要获取FactoryBean的实现类的bean:在getBean中引用名前加上“&”

      @Test
      public void test3() throws Exception {
         CarFactory02 carFactory02 = (CarFactory02) context.getBean("&carFactory02");
         carFactory02.getObject().run();
      }