String

由于课上学的时候,老师讲的偏快,不是很能听的全,加上就讲了1、2天,所以就去翻了网上教程,稍微细致点地复习了一遍,记写基础知识。教程还没听完,先记录下一部分。

1、模拟Spring核心容器

单例对象:

public class BeanFactory {
    private static Properties props;
    private static Map<String,Object> beans;

    static{
        try {
            props=new Properties();
            InputStream in=BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties");
            props.load(in);
            beans=new HashMap<String,Object>();
            Enumeration keys=props.keys();
            while(keys.hasMoreElements()){
                String key=keys.nextElement().toString();
                String beanPath=props.getProperty(key);
                Object value =Class.forName(beanPath).newInstance();
                beans.put(key,value);
            }
        } catch (Exception e) {
            throw new ExceptionInInitializerError("初始化properties失败");
        }
    }

    public static Object getBean(String beanName){
        return beans.get(beanName);
    }
}

多例对象:

public class BeanFactory {
    private static Properties props;

    static{
        try {
            props=new Properties();
            InputStream in=BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties");
            props.load(in);
        } catch (Exception e) {
            throw new ExceptionInInitializerError("初始化properties失败");
        }
    }
    public static Object getBean(String beanName){
        Object bean=null;
        try{
            String beanPath=props.getProperty(beanName);
            bean=Class.forName(beanPath).newInstance();
        }catch (Exception e){
            e.printStackTrace();
        }

        return bean;
    }
}

多例模式对象会创建多次,执行效率没有单例对象高

IOC

控制反转(Inversion of Control,简写IOC),把创建对象的权利交给框架,是框架的重要特征,并非面向对象编程的专业术语。它包括依赖注入(Dependency Injection,简称DI)和依赖查找(Dependency Lookup)

IOC作用

削减计算机程序的耦合(解除我们代码中的依赖关系)

2、知识点

1. ApplicationContext的三个常用实现类

ClassPathXmlApplicationContext

它可以加载路径下的配置文件,要求配置文件必须在路径下,否则加载不了(配置文件所在的目录必须要在IDEA中设置为任何类型的目录但是一般设置为Resource类型的目录)

ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");

FileSyetemXmlApplicationContext

它可以加载磁盘下任意路径下的配置文件(必须有访问权限)

加载方式如下:

ApplicationContext ac = new FileSystemXmlApplicationContex("C:\\user\\greyson\\...")

AnnotationConfigApplicationContext

它是用于读取注解创建容器的

2. 核心容器的两个接口引发出来的问题

  • ApplicationContext:它在创建核心容器时,创建对象采取的策略是采用立即加载的方式,也就是说,只要一读取完配置文件就马上创建配置文件中配置的对象

    • 单例对象适用
    • 开发中常采用此接口
    • ApplicationContext 唯一的不足是占用内存空间。当应用程序配置Bean较多时,程序启动较慢。
  • BeanFactory: 它在构建核心容器时,创建对象的策略是采用延迟加载的方式,什么时候获取 id 对象了,什么时候就创建对象。

    • 多例对象适用

3. 三种创建 Bean 对象的方式

  • 调用构造函数创建Bean

    public class Person{
        private String name;
        
        public Person(){
            super();
        }
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }
 <bean id="Person" class="com.edu.entity.Person"></bean> 

因为是通过构造函数创建Bean,因此我们需要提供无参数构造函数,另外我们定义了一个name属性,并提供了setter方法,Spring容器通过该方法为name属性注入参数。

  • 调用实例工厂方法创建Bean
 <bean id="instanceFactory" class="com.edu.factory.InstanceFactory"></bean>
 <bean id="accountService" factory-bean="instanceFactory" factory-method="getAccountService"></bean>
  • 调用静态工厂方法创建Bean
<bean id = "accountService" class = "com.edu.factory.StaticFactory" factory-method="getAccountService"></bean>

4.bean 的作用范围

4.1. bean 标签的 scope 属性

作用:用于指定 bean 的作用范围

取值:常用的就是单例和多例

  • singleton : 单例的(default)

    • 1)在容器启动完成之前就已经创建好对象,保存在容器中
    • 2)任何获取都是获取之前创建好的对象
  • prototype : 多例的

    • 1)容器启动默认不会去创建多实例bean
    • 2)获取时去创建这个bean
    • 3)每次获取都会创建一个对象
  • request : 作用于 web 应用的请求范围
  • session : 作用于 web 应用的会话范围
  • global-session : 作用于集群的会话范围(全局会话范围),当不是集群范围时,它就是 session(代替多服务器下的session)