初识Spring

本文深入解析Spring框架的基本概念,包括其轻量级特性、控制反转(IoC)、面向切面(AOP),以及如何在Eclipse中安装Spring插件、配置Spring XML文件和管理bean对象生命周期。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基本了解:

    首先要知道Spring是框架的一种。Rod Johnson是Spring框架的缔造者,他编写了interface21框架,这是一个力图冲破JavaEE传统开发困境,从实际需求出发,着眼于轻便、灵巧,易于开发、测试和部署的轻量级开发框架。Spring框架以interface21框架为基础,经过重新设计不断丰富其内涵,于2004年3月24日发布了1.0正式版。具体内容可查看百度百科:https://baike.baidu.com/item/Rod%20Johnson/1423612?fr=aladdin

几个概念性知识:

    Spring是一个轻量级控制反转(IoC)和面向切面(AOP)的容器开源框架。

     轻量:轻量与重量是一个相对的概念,大小开销两方面而言Spring都是轻量的。EJB(另一种框架)比较大,且其启动时需要消耗大量的内存、CPU等资源,所以是重量级框架;而Spring则不是,所以是轻量级框架。

    容器:该容器中存放Java对象,并且管理其内部存储Java对象的生命周期;

    开源:可以从Spring官网下载到Spring源代码;

    框架:为解决一个开放性问题而设计的具有一定约束性的支撑结构。在此结构上可以根据具体问题扩展、安插更多的组成部分,从而更迅速和方便地构建完整的解决问题的方案。

    控制反转(IoC):是面向对象编程中的一种设计思想,即反转资源获取的方向;

    面向切面(AOP):(还在学习中,稍后补充)

    下面给出spring官网:http://projects.spring.io/spring-framework/

Spring框架结构:

         

使用一般步骤:

    1,向eclipse中安装插件(插件版本应与eclipse版本相同)

        访问http://spring.io/tools/sts/all网页,下载和所用Eclipse版本对应Spring Tool Suite离线工具。

        下载完成后,

      b、计算机断开网络连接;

      c、打开Eclipse,点击“Help”菜单,出现下图:

            

      d、点击“Install New Software…”,出现下图:

            

      e、点击“Add…”按钮,出现下图:

            

     f、点击“Archive…”按钮,然后选择刚下载的Spring Tool Suite Eclipse 插件,出现下图:

            

      g、点击“OK”按钮,出现下图:

            

      h、选中上图四个“XXX/Spring IDE”选项,不要勾选上图蓝框复选框,点击“Next>”,出现下图:

            

      .i、点击“Next>”,出现下图:

            

      j、点击“Next>”,出现下图:

            

      k、选择“I accept the terms of the license agreement”,然后点击“Finish”,至此开始向Eclipse中安装“Spring Tool Suite Eclipse”插件,过一会儿出现下图:

            

      l、点击“Install anyway”按钮,过一会儿出现下图:

            

      m、点击“Restart Now”按钮,重启Eclipse即可完成安装。

    2,下载Spring相关jar包

        logging jar包下载地址:https://commons.apache.org/proper/commons-logging/download_logging.cgi

        Spring jar包下载地址:http://repo.springsource.org/libs-release-local/org/springframework/spring/

    3,创建工程并添加如下jar包

               

        如果是Java工程,为了使这些jar包起作用,需要先选择这些jar包——>鼠标右键点击Build Path——>Add to Build Path;如果是Java Web工程只需将这些jar包拷贝到WEB-INF中lib文件夹即可;

    4,创建类

             

    5,创建Spring xml文件

      ①、选中src目录——>鼠标右键,选中并点击“Other…”项——>找到并打开“Spring”节点,出现下图:

            

     ②、选择“Spring Bean Configuration File”子节点,点击“Next>”按钮,出现下图:

            

      ③、在“File name”文本框输入配置文件的文件名(这里为applicationContext.xml),点击“Next>”按钮,出现下图:

            

      说明:在创建Spring XML文件前需要先导入相应的jar包,否则上面红框区域不会出现那些Spring命名空间项。

    6,配置xml文件(图中我已经配置好了,property标签暂时不需要)

        

 

        里面的具体内容,在下面进行讲解更容易理解,所以我在下面进行解释。

        看下面代码,下图是我又创建的Test类进行的测试:

        

        当执行到new ClassPathXmlApplicationContext("applicationContext.xml")这一语句时,通过查找applicationCoontext.xml文件配置,创建了Spring容器,同时也创建了bean对象(懒加载时,只创建容器,不创建对象)。

        当执行到applicationContext.getBean("student")时,表示使用该对象,其中getBean()方法的小括号中值为applicationCoontext.xml文件中配置的id值,这一步执行完,我们就可以使用该对象调用方法了。在我这个例子中,我调用了我自己写的无参构造方法。

     现在讲解xml文件的配置:

        可以理解<beans>里面可以有很多个对象,一个<bean>代表着一个对象,id用于getBean()中选择使用哪个对象,而class中的值代表着,这个bean对象是由哪个类创建的,其中的值是类的路径。

一些标签中的属性:

  bean中的属性:(主要用于第三方的类,比如Object,Date等,下面的例子没有遵循此规则)

        id:

            上面已经说明,id用于getBean()中选择使用哪个对象,而class中的值代表着,这个bean对象是由哪个类创建的,其中的值是类的路径。

        name:(基本不使用)

                   

            其中name的值可以有多个,但是不同值之间要用","(逗号)或者" "(空格)隔开。

            没有id和name属性时(有id和name时也可以用),可以通过调用getBean(Class对象或类全名)方法获取到Spring IOC容器中的对象,如下所示:

                  

        lazy-init:

            默认情况下,IOC容器初始化时便会把bean实例化,可以通过如下两种方式实现bean实例化懒加载(即在使用该bean对象时才实例化,这样可以节省系统资源):

                a、在beans标签中添加default-lazy-init="true",则在该标签中配置的所有bean将实现懒加载,不会创建对象;

                b、在对应的bean标签中添加lazy-init="true",则该bean将实现懒加载,不会创建对象

                注意:bean标签中设置lazy-init的优先级高于在beans标签中设置default-lazy-init

        scope:

              scope="singleton":默认值,IoC容器中只存在一个Java类对象,此时Java对象为单例,即每次从IoC容器获取的Java对象都是同一个;

              scope="prototype":每次从IoC容器获取Java对象都是新的对象;

              scope="request":每次HTTP请求都会创建一个新的Bean,该作用域只适用于WebApplicationContext环境;

              scope="session":每次有新的会话都会创建一个新的Bean,该作用域只适用于WebApplicationContext环境;

        autowire:

              指定自动装配的模式,自动装配模式一共有四种:

                1、no(default):默认值,禁用自动装配;

                2、byName:根据属性名称自动装配;

                3、byType:根据属性类型自动装配;

                4、constructor:通过构造方法自动装配,不推荐使用;

        parents:子bean 也可以覆盖从父bean 继承过来的配置;注意:该属性不允许配置多个值。

              parents和类的继承关系相似,bean是从父bean中继承属性的值,在使用对象的时候,直接使用student对象,也会输出“红星小学”。

                     

        depends-on:当前bean初始化之前强制depends-on标签属性指定的一个或多个bean被初始化,depends-on标签属性值可以有多个,属性值之间使用逗号,空格及分号间隔;注意:该属性没有继承性;简单理解来说,在xml中可以有多个bean,默认情况下,这些bean的创建顺序是从上到下。假如有beanA和beanB,如果beanA中有depends-on="B",那么无论beanA和beanB的顺序是怎样的,只要beanB没有创建,beanA就不会创建。

        bean生命周期:

            通过构造方法或工厂方法创建bean对象——>为bean属性赋值——>调用 bean 的初始化方法,即init-method指定方法——>bean实例化完毕,可以使用——>容器关闭, 调用 bean 的销毁方法,即destroy-method指定方法。

        init-method:在设置bean的属性后执行的自定义初始化方法,注意:1,该方法不能有参数;2,对象每创建一次就会执行一次该方法;

        destroy-method:该参数中的方法只有bean标签属性scope为singleton且关闭Spring IOC容器时才会被调用,注意:该方法不能有参数

            比如:<bean id="student" class="spring.student" init-method="a" destroy-method="b" scope="singleton"></bean>

                   student中的方法执行顺序是这样的:构造方法,set方法,init方法,destroy方法。当scope的属性值为prototype时,destroy-method不会被调用。

        abstract:(没有继承性)

            如果bean里面有abstract="true",那么即使不是懒加载,不会创建对象。

  property中的属性

        name用来选择类中的属性的属性名,value为该属性设置值。

  context:component-scan标签:(主要用于自己写的类,功能和bean相同)

        Spring容器通过context:component-scan标签扫描其base-package标签属性值指定的包及其子包内的所有的类并实例化被@Component、@Repository、@Service或@Controller等类注解所注解的类。

        四个注解一般使用的地方:

              @Component:基本注解

              @Repository:持久层(一般为dao层)注解

              @Service:服务层或业务层(一般为service层)注解

              @Controller:控制层(一般为controller层)注解

      注意:

          1、使用context:component-scan标签需要添加spring-aop-4.3.10.RELEASE.jar包

          2、base-package标签属性属性值:

                a、Spring 容器将会扫描该属性值指定包及其子包中的所有类;

                b、该属性值支持*通配符,例如“com.lq.*.imp”表示扫描诸如com.lq.book.imp包及其子包中的类;

                c、当需要扫描多个包时, 使用逗号分隔;

                d、resource-pattern标签属性可以指定Spring容器仅扫描特定的类而非基包下的所有类,比如resource-pattern="/*.class"表示只扫描基包下的类,基包的子包不会被扫描。

@Autowired

    1、成员变量(不考虑访问权限)、构造函数或setter方法都可以使用@Autowired注解

    2、默认情况下@Autowired 注解依据类型自动为成员变量赋值,当 IOC 容器里存在多个类型相同的 Bean 对象时就会依据成员变量名进行赋值,此时要求变量名必须是多个Bean对象中的一个,否则就会出现异常, 该异常可以通过在 @Qualifier 注解指定实例名的方式解决;

               3、默认情况下,通过@Authwired 注解为成员变量赋值时,如果Spring 找不到匹配的 Bean为成员变量赋值则会抛出异常;如果该成员变量允许不被设置, 可以设置 @Authwired 注解的 required 属性为 false;

                       

               当包中有两个类名相同的类时,可以在注解后面加上("value"),如上图所示。

               如上图,其中StudentDao没有加四个注解中的任何一个,此时没办法为sudentDao装配值,所以要在Autowired后加上(required=false),其中required的默认值为 true。

@Resource

    @Resource注解提供一个name属性用于设定Spring对象实例名;

@Inject

    @Inject注解和@Autowired注解一样也是按类型为成员变量赋值,但该注解没有reqired属性。

DI(Dependency Injection,依赖注入):

        所谓依赖注入,就是由IOC容器在运行期间,通过对象间依赖关系动态地为某个Java对象(例BookService对象)注入其所依赖的Java对象(例BookDao对象),有三种注入方式:构造器注入(constructor-arg标签)、Setter(property标签)注入、工厂方法注入,其中前两种用的最多,工厂方法注入很少使用。

    IoC和DI并不相同,DI主要强调的是“赋值”;IoC强调的是“控制”和“反转”,比如由主动创建对象,变为由Spring控制创建,主动变成了被动,控制权颠倒过来了。

    https://www.martinfowler.com/articles/injection.html

SpEL:(Spring 表达式语言)    

        一个支持运行时查询和操作对象图的强大的表达式语言,其语法类似于 EL表达式:SpEL 使用 #{…} 作为定界符。

    SpEL有以下作用:

        1、设置字面值,注意:String类型字面值需要使用单引号或者双引号引起来:

                 

        2、引用其它bean对象:

                 

        3、调用属性或方法:

            a、调用非静态属性或非静态方法,语法结构:#{其它bean id值或name值.非静态属性或非静态方法}

                 调用非静态属性:属性的访问权限必须为public,否则要为该属性提供相应的getter方法

                 

                 调用非静态方法:

                

            b、调用静态属性或静态方法,语法结构:#{T(类名).静态属性或静态方法}

                 调用静态属性:

                 

                 调用静态方法:

                 

            4、支持运算符操作:

              a、算数运算符:+、-、*、/、%、^(乘方)

              b、条件运算符:比如三目运算

              c、关系运算符: <、>、==、<=、>=、lt、gt、eq、le、ge

              d、逻辑运算符号: and、or、not、!

              e、正则表达式:matches

如何为构造方法中参数赋值:

              constructor-arg子标签:指定创建类对象时使用哪个构造函数,每一对constructor-arg子标签配置一个参数列表中的参数值;如果不配置子标签,则默认使用无参构造函数实例化对象。说白了,这个标签就是决定调用哪个构造方法,并且给构造方法中的参数赋值的。
        1、String类型、基本数据类型或其包装类都可以在constructor-arg标签里使用value标签属性赋值;

                     
        2、类类型(自定义类型) 在constructor-arg标签里使用ref

                     

                     
        3、数组 constructor-arg ——>array——>value(String类型、基本数据类型或其包装类),ref>bean类类型(自定义类型)

                    

                   
        4、集合:
            List:constructor-arg ——>list——>value(String类型、基本数据类型或其包装类),ref>bean类类型(自定义类型)

                     

                    
            Set:constructor-arg ——>set——>value(String类型、基本数据类型或其包装类),ref>bean类类型(自定义类型)

                      

                    
            Map:constructor-arg ——>map——>
                    entry:key或value是String类型、基本数据类型或其包装类,则分别使用entry标签中key和value标签属性

                  
                   entry:key或value是类类型(自定义类型),应该使用对相应的key-ref或value-ref

                      (两种赋值方法)

                    
        5、Properties:constructor-arg ——>props——>prop  只能配置String类型

                     

 

                       尚未完工!(如有不同见解,欢迎下方评论)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值