/Spring-IOC

Spring配置有两种方式xml和java style

Primary LanguageJava

Spring-IOC

Spring配置有两种方式xml和java style

IOC是什么

控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。 其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。

Spring

· spring的IoC(控制反转)就是一个工厂模式变种,
· spring核心就是IoC容器,实现这个容器的接口BeanFactory,BeanFactory是最核心的、最纯粹的
方法:
getBean()
实现类:
ApplicationContext

· 简单工厂

     public class ServiceFactory() {
        public Object getServiceObject(String name) {
        
            if("bs".equals(name)) {
                A a = new A();
                B b = new b();
                MyBatiscConnection conn = new MyBatiscConnection();
                BookService bookservice = new BookService();
                
                //同通过setter的方式来确定他们的关系是如何的
                //B对象包含A对象
                b.setA(a);
                //MyBatiscConnection对象包B对象
                conn.setB(b);
                //**********__``````````__**********
                bookService.setConn(conn);
                log.setConn(conn);
                bookservice.setLogger(log);
                return bookService;
                                
            }
        }
        
     }
  • 在调用的时候就变得了简单了
  •     public class Test () {
            
            public static void main(String[] arge) {
                ServiceFactory sf = new ServiceFactory();
                
                BookService bookservice = sf.getSerivceObject("bs");
                //然后在调用bookservice的某个方法
            }
        }
    
  • 小结:
  • 我们在中间加了一层,虽然不用在调用的时候,创建很多的对象。但在工厂模式中代码类增加了, 我们在维护的时变得困难了。

  • 所以后面出现了:XML文件的形式来更清晰的描述,类的创建和类与类之间的关系
  •     <!--之前是命令的形式,xml是描述的形式 -->
        <xml>
              <bean id="a" class="com.wgc.entity.A">
              </bean>
              <bean id="b" class="com.wgc.entity.B">
                <property name="a" ref="a"/>
              </bean>
              <bean id="conn" class="org...MyBatiscConntion">
                <property name="b" ref="b"/>
              </bean>
              <bean id="log" class="org...LogUitl">
                <property name="conn" ref="conn"/>
              </bean>
              <bean id="bookService" class="com...BookService">
                 <property name="conn" ref="conn"/>
                 <property name="log"  ref="log"/>
              </bean>
        </xml>
    
  • 结论
  • 使用xml的文件中Bean标签配置,更加清晰的描述出类与类之间的关系。
  • 门面模式:
  • 例子:有一个工厂有很多的部门,要买东西的时候我们不可能一个一个部门去卖,所以把所以部门组合在一起,在去卖。

    spring有三种方式描述 1、@Bean java类方法
    2、 xml
    3、开启扫描的模式 @Component
    @ComponentScan(basePackages="learning.spring")
    @ImportResource(locations = "learning/spring/my-spring.xml")
    @Service
    @Controller: 这个注解@ControllerAdvice只作用在加上@Controller的类上
    @Repository

    4、是java代码写spring的配置

      要在类的头部加上@Configuration注解  
      @Configuration
      如果要在java类上加这个注解就是相当xml文件中<beans>
    

    工厂模式与IoC的区别:

    工厂模式在调用时才创建对象;
    IoC容器在启动就创建了所有的对象(可以加属性lazy-init="true":意思是这个对象没有那么重要不着急创建), 还有所有的对象在刚刚开始都是单例模式创建了(可以加scope="prototype"修改:一般我们不会这么做,因为每次都创建一个新的对象,对内存的消耗是非常大的)

    	denpend-on 定义顺序(属性)
    	parent 定义继承(属性)
    	scope 定义初始化策略(属性)
    	lazy 延迟初始化	(属性lazy-init)
    	alias 定义别名(标签)
    	import 引入其他的定义文件(标签)
    	
    		
    		例子: <import resource="文件名"/>
    			  <alias name="rabbits" alias="ADO"/>
    			  或是<alias name="ADO" alias="rabbits"/>