探究spring:1.applicationContext初始化以及IOC和DI的初步认识

本文详细探讨了Spring框架中的IoC(控制反转)和DI(依赖注入)概念,从beanFactory的基本功能出发,逐步深入到applicationContext和webApplicationContext的高级特性。介绍了通过XML配置和注解方式实现bean的管理,以及在Web环境下如何整合Spring。

参考书籍:spring4.x企业应用开发实践

开发环境:idea2019.1.3 spring5.1.7 mysql8.0.13

 

理论:第4章里讲到beanFactory,初步认知就是,beanFactory通过先内输入配置文件,向外输出bean类,以此达到控制反转的目的,不再需要自己创建bean类,bean类由spring容器来创建。beanfactory在装载配置文件时,不会实例化里面的bean。

实现:先通过resourcePatternResolver来装载bean的配置文件,之后创建一个defaultListableBeanFactory,在beanfactory中加载resource。

理论:在beanFactory的基础上,创建了一个applicationContext来继承beanFactory,并添加了更多的功能,applicationContext可以直接通过路径加载配置文件,或者通过基于类注解的方式。applicationCotnext在装载配置文件时,会实例化里面的bean。

基于路径:

ApplicationContext ctx =
        new ClassPathXmlApplicationContext("beansFactory/beans3.xml");
        //new FileSystemXmlApplicationContext("G:/WebProject/springWorkSpace/chapter1/src/main/resources/beansFactory/beans3.xml");

基于类注解的方式:

先创建一个bean

@Configuration
public class userBean {

    @Bean(name = "testUser")
    public testUser builderuserBean(){
        testUser testuser = new testUser();
        testuser.setPassword("111111");
        testuser.setUsername("Lisi3");
        return testuser;
    }
}

第二步,把这个类调用到 

AnnotationConfigApplicationContext

具体是

@Test
public void getBeanByInvoke() {
    ApplicationContext ctx = new AnnotationConfigApplicationContext(userBean.class);
    testUser testuser = ctx.getBean("testUser",testUser.class);
}

个人理解是把类加载到applicationcontext中,通过里面的@Bean注释来表名这个是个bean,然后解析调用。

理论:再进一步,在applicationContext的基础上构建一个更加高级的webapplicationContext,它在原来的基础上面向web应用添加了很多功能。先介绍一下webapp的原理:

部署启动tomcat后,tomcat会通过xml配置文件来识别webapps下的各个web应用,先创建一个servletContext,然后读取xml,然后创建一个xml的实例,xml里面包括了servletContext的配置信息和serlvet的配置信息,通过servletConfig来装配xml里的信息,然后创建servlet,可以说servlet里面包含了很多的配置文件,同时每个web应用对应一个单独的servletContext,web应用下的servlet可以通过这个servletContext来交换信息。

webapplicationContext也就是通过这个servletContext来和webapp产生联系,在servletContext启动之后,webapplicationContext把一个键值对放入到servletContext中,键名为ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE,键值为webaoolicationContext的对象,通过这样把两个联系起来。

实践:在web应用的配置文件web.xml中添加方法来调用webapplicationContext的实例,第一种方法,使用ContextLoaderListener,添加

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:smart-context.xml</param-value>
</context-param>

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

第一行是表名webapplicationContext的配置文件的位置,第二个listener是启动webapplicationContext来寻找配置文件的信息

第二种,在不支持监听器的低版本web容器中,通过

<servlet>
    <servlet-name>springContextLoaderServlet</servlet-name>
    <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

但是在我实际使用中,发现我的org.springframework.web.context下没有这个类,猜测是我的版本的问题。

第三种,通过类解释的java文件作为配置文件,

未尝试(不知道如何写java类作为配置文件)

 

IOC就是Inverse of Control 初步理解就是,把要调用的方法,以bean的形式写在xml配置文件中,然后通过加载配置文件,让spring容器来实例化对象进行调用,DI就是Dependency Injection,初步理解就是,在一个个类中,当需要实例化另外一个类的对象时,不再使用直接实例化,而是选择,set舒心注入,或者构造函数注入等方法,

例如:

BookDao bookDao = new BookDaoLmpl();//不再使用

改成

private BookDao bookDao;

public void setBookDao(BookDao bookDao){

this.bookDao = bookDao;

}

这样可以使,如果你原本想改变bookDao的实例对象时,你得在这个类里面把BookDaoLmpl改成别的,现在你不需要了,这样就降低了耦合程度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值