Loading

第二章 第一个Spring程序

1.软件版本

  • JDK1.8+
  • Maven3.5+
  • IDEA2018+
  • 当Maven是3.6,IDEA是2019时会存在配合上的问题
  • SpringFramework5.1.4

2.环境搭建

  • Spring的jar包

    <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.1.4.RELEASE</version>
    </dependency>
    
  • Spring的配置文件

    1. 配置文件的放置位置
    	任意位置,没有硬性要求,一般在resource目录下
    2. 配置文件的命名
    	没有硬性要求,建议application.xml
    	
    应用Spring框架时,需要进行配置文件路径的设置
    

image

3.Spring的核心API

  • ApplicationContext

    作用:ApplicationContext工厂或者容器,用于对象的创建
    好处:解耦合
    
    • ApplicationContext接口类型

      接口:屏蔽实现的差异
      非Web环境 : ClassPathXmlApplicationContext(main junit)
      Web环境 : XmlWebApplicationContext
      

    image

    • 重量级资源

      ApplicationContext工厂的对象占用大量内存
      不会频繁创建对象 : 一个应用只会创建一个工厂对象
      ApplicationContext工厂 : 一定是线程安全的(并发访问)
      

4.程序开发

1. 创建类型
	public class User {
    private String username;
    private String password;
    ...      
2. 配置文件的配置 applicationContext.xml
	<bean id="user" class="com.dong.User"/>
3. 通过工厂类,获得对象 
	//1.获得Spring工厂
	ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("/applicationContext.xml");
	//2.通过工厂类获得对象
	User user = (User)context.getBean("user");

5.细节分析

  • 名词解释

    Spring工厂创建的对象,叫做bean或者组件(componet)
    
  • Spring工厂相关方法

    @Test
    public void test() {
        
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("/applicationContext.xml");
        
        //getBean方法重载id
        User user = (User)context.getBean("user");
        System.out.println(user);
        
        //getBean方法重载class,只能有一个class是User的id
        User user = context.getBean(User.class);
        System.out.println(user);
        
        //getBean方法重载id和class
        User user = context.getBean("user", User.class);
        System.out.println(user);
        
        //获取Spring工厂配置文件中所有bean标签的id值
        String[] names = context.getBeanDefinitionNames();
        for (String name : names) {
            System.out.println(name);
        }
        
        //根据类型获得Spring配置文件中对应的id值
        String[] names = context.getBeanNamesForType(User.class);
        for (String name : names) {
            System.out.println(name);
        }
        
        //用于判断是否存在指定id值得bean
        boolean user = context.containsBeanDefinition("user");
        System.out.println(user);
        
        //用于判断是否存在指定id值得bean
        boolean user = context.containsBean("user");
        System.out.println(user);
    }
    
  • 配置文件中需要注意的细节

    1. 只配置class属性
    <bean class="com.dong.User"/>
    a)上述配置,有没有id值? com.dong.User#0(没有设置id的bean从0开始)
    b)应用场景 : 这个bean只使用一次
    2. name属性
    作用 : 给bean设置别名
    与id的相同点:
    			1. context.getBean("id|name")-->Object
    			2. <bean id="" class=""等效<bean name="" class=""
    与id的不同点:
    			1. 别名可以设置多个,id只能设置一个
    			<bean name="p,p1..."
    			2. XML的id属性值,命名要求 : 必须以字母开头,以字母\数字\下划线\连字符组成
    			        name属性值,命名没有要求
    			   XML发展到今天,id属性值的限制已经不存在了,id和name是历史遗留的问题
    			3. 代码
    				 //用于判断是否存在指定id值的bean,不能判断name值
     					boolean user = context.containsBeanDefinition("user");
     					System.out.println(user);
     
     				//用于判断是否存在指定id值的bean,可以判断name值
     				boolean user = context.containsBean("user");
     				System.out.println(user);
    

6.Spring工厂的底层实现原理(简易版)

Spring工厂是可以调用对象私有的构造方法创建对象

image

7.思考

问题:在开发过程中,是不是所有的对象,都会交由Spring工厂来创建?
回答:理论上,是的
	特例:实体对象(entity)是不会交由Spring创建,它由持久层框架来创建
posted @ 2022-07-16 17:10  苏无及  阅读(16)  评论(0编辑  收藏  举报