zoukankan      html  css  js  c++  java
  • spring(一) IOC讲解

    一、什么是IOC?

        IOC:控制反转,通俗点讲,将对象的创建权交给spring,我们需要new对象,则由spring帮我们创建,然后供我们使用。

        编写IOC的helloworld。简单的三步就搞定了

          1、导入jar包

              5个包,4个核心包,1个依赖包  

                  

                  

          2、编写配置文件

              spring帮我们创建对象,但也必须有相关类的信息,不然怎么能够创建呢?

              配置文件名称:建议:ApplicationContext.xml,取别的也可以,但是取建议的名称的话,找到该配置文件更为简单,

              配置文件位置:任意,一般都在classpath下(src)

              文件约束内容:添加约束,spring-framework-3.2.0.RELEASE 为spring的核心  docs为帮助文档

                   约束位置:spring-framework-3.2.0.RELEASEdocsspring-framework-referencehtmlxsd-config.html

                  

                        

                    

          3、从spring容器中获取对象

                

        

            UserService.java              

                  

    二、依赖注入(DI)

          现在应该知道了什么是IOC,helloworld很简单吧,但spring如果只提供这么一个简单的功能,就不能被大家那么所崇拜了,上面只是把IOC这个功能给大家简单展示一下,让大家脑海中有IOC是干什么的,能做什么的概念,现在就对其进行加强把。

          依赖注入(DI):spring创建对象A时,会将对象A所依赖的对象B也创建出来,并自动注入到对象A中。

                  依赖:(has a) 有一个的意思,比如类A中有一个类B,那么就说A依赖B。          继承,实现(is a)

                                      

                  而我们说的依赖注入,就是当创建A对象时,同时会将B对象给创建,并自动注入到对象A中去,也就说,我只叫spring给我A对象,但是A中可以使用B对象了。这个有很大的用处,但如何去实现依赖注入功能呢?

                

                

            UserService中有使用userDao对象,这个我们都很熟悉的使用伎俩,service层调用dao层的方法。按照往常我们的写法,在service中需要自己new出UserDao对象,但是在spring中就不需要了,一切对象都让spring帮我们创建。

            ApplicationContext.xml

                

            过程就如图中所画,先创建UserService对象,然后在根据property中的ref找到userDaoId并创建UserDao对象,然后根据property中的name,通过setter方法注入,这样就完成了依赖注入。

           测试:

              

          

    三、spring创建实例对象的三种方法

           因为并不是每个bean都是普通类,有些是通过工厂来获取的,而工厂就有静态工厂和实例工厂,所以spring创建实例对象有三种情况,

           默认无参构造,就是编写IOC的helloworld的那种方式,直接<bean id="" class="">

           静态工厂:由于是静态工厂,所以通过工厂类直接调用创建实例的方法就可以了。

                <bean id="" class="工厂全限定类名" factory-method="静态方法">

           实例工厂:需要先创建出工厂实例,然后在由工厂创建对象

                <bean id="myFactoryId" class="工厂全限定类名"></bean>

                <bean id="" factory-bean="myFactoryId"  factory-method=""></bean>

          

    四、属性依赖注入基于XML

           之前讲的那个依赖注入其实也属于属性依赖注入这一范畴中,在最开始我们演示IOC(控制反转)也就是spring帮我们创建实例时,那只是通过无参构造方法进行创建,那么在实际开发中,这样创建肯定是不行的,所以我们需要在spring的配置文件中配置一些属性信息,使spring帮我们创建时,可以直接将对象的一些属性也注入进去,有两种方法

           通过构造方法注入

                  

              不管是普通属性还是引用数据,都可以通过构造方法进行注入。

           通过setter方法进行注入

                   

               通过setter方法对普通属性和引用属性进行注入,那么要是创建的对象中有集合呢?那该如何进入注入?

             集合的注入List、Map、Set、数组、Properties等。

               List

                    

               set

                  

                map

                  

               数组

                  

               propertyis

                  

                注意:properties这种类型存放形式跟map差不多,以key和value进行存放的,

                      

          到这里,基本上就把所有能够注入的属性类型都讲解完了,注入的类型基本上分为三块,普通类型,引用类型和集合。下面在讲一种基于注解来注入各种,因为基于xml感觉很麻烦。

    五、属性依赖注入基于注解

          注解格式:@xxx

          使用注解:必须对使用注解的地方进行扫描,不然注解没用。而扫描需要做两件事

              1、添加名称空间,

                  在我们找配置文件中约束的位置那:spring-framework-3.2.0.RELEASEdocsspring-framework-referencehtmlxsd-config.html 找到context的名称空间。

                  

                           

              2、扫描指定的目录,

                      

         注解:

            1、@Component  替代  <bean id="" class=""> 可以配置任意bean,在所在类上面添加该注解即可,

                    @Component("userId") userId相当于bean中的id属性值

                     

            2、  这三个就跟使用@Component是一样的,但是为了更好的体现三层架构,就有了这三个注解

             @Controller  修饰web层中的类。

             @Service  修饰service层的类

             @Repository  修饰dao层的类

                两种方式,一种不声明名称,一种声明名称

                @Controller("xxx")  @Controller  

                如果声明了名称,那么在别的地方引用的话,就可以使用@Autowired或@Autowired与@Qualifier的组合 或直接使用@Resource按照名称注入

                如果没有声明名称,那么在别的地方引用的话,只能使用@Autowired 来进行注入

           3、属性注入

             普通属性

                @Value    @Value("")  给普通属性注入属性值

              引用属性

                  @Autowired  按默认类型进行注入

                  @Qualifier("") 按照名称注入  

                如果使用了@Qualifier这个注解,那么就需要两个一起使用才能生效。如果只使用@Autowired,那么写不写@Qualifier都可以

              引用属性

                @Resource  直接按照名称注入,与上面两个注解一起使用是等效的  

                    @Resource(name="xxx")

                 

           4、使用

               

                           

           5、其他注解

               @Scope("prototype")  作用域注解(spring帮我们创建的bean实例的作用域,在下面会讲解到)

               @PostConstruct  修饰初始化    

               @PreDestory  修饰销毁      

                    最后两个用的不多,掌握前面的即可。

          

    六、spring创建的bean的作用域  

          也就是spring帮我们创建的bean的使用范围。

          格式:<bean id="" class=""  scope="....">

          取值:

                

          掌握前两个,singleton 和prototype

              singleton:单例,也就是当spring通过xml配置文件帮我们创建一个bean对象时,那我们拿到的就一直是同一个对象,仅存在一个那样的bean实例。默认值

                    

                  

              prototype:每次我们需要bean实例时,都会创建一个新的实例。

                    

                  

    七、编写applicationcontext.xml提示问题

             五步即可解决

             第一步:spring的核心jar中找到Scheme xsd文档

                  spring-framework-3.2.0.RELEASEschemaeansspring-beans-3.2.xsd

                  

             第二步:从xml配置文件中,获取xsd文档位置,复制....spring-beans.xsd

                  

             第三步:window/preferences/ 搜索 “xml catalog”

                    

            第四步:

                  

            第五步:

                  

            

                注意:如果xml没有提示,关闭xml重写打开。

    八、总结

          spring的第一个重点IOC,就这样讲完了,其实看完之后非常简单,就是让spring给你创建对象,你想要对象的时候,就找spring,让他给。

          学的东西有:

              什么是IOC,什么是依赖注入。

              之后对依赖注入进行详细的讲解。

                    使用xml方式和使用注解方式

          说简单点,这一节就是学会了通过配置,让spring帮我们创建我们想要的bean。


      转自 http://www.cnblogs.com/whgk/ 如有侵权,随时联系我删除文章。

  • 相关阅读:
    Nginx 部署多个 web 项目(虚拟主机)
    Nginx 配置文件
    Linux 安装 nginx
    Linux 安装 tomcat
    Linux 安装 Mysql 5.7.23
    Linux 安装 jdk8
    Linux 安装 lrzsz,使用 rz、sz 上传下载文件
    springMVC 拦截器
    spring 事务
    基于Aspectj 注解实现 spring AOP
  • 原文地址:https://www.cnblogs.com/runningLi/p/6638772.html
Copyright © 2011-2022 走看看