zoukankan      html  css  js  c++  java
  • 依赖注入

    使用工厂方法实例化bean

    <bean id="personService2" class="com.maple.service.impl.PersonServiceBeanFactory"
         factory-method="createPersonServiceBean"></bean>
         
         <bean id="personServiceFactory" class="com.maple.service.impl.PersonServiceBeanFactory"></bean>
         <bean id="personService3" factory-bean="personServiceFactory"
         factory-method="createPersonServiceBean2"></bean>

     一,手工装配

    1,基于xml配置

    <bean id="personService" class="com.maple.service.impl.PersonServiceBean">
                <property name="personDao">
                    <bean class="com.maple.dao.impl.PersonDaoBean"></bean>
                </property>
                <property name="name" value="maple"></property> //属性setter方法注入
                <property name="id" value="15"></property>
            </bean> 
    <bean id="personService" class="com.maple.service.impl.PersonServiceBean">
            //构造器注入
            <constructor-arg index="0" type="com.maple.dao.PersonDao" ref="personDao"></constructor-arg>
            <constructor-arg index="1" value="dancing"></constructor-arg>
    </bean>

    2,在java代码中使用@Autowired或@Resource

    但在xml文件中需要配置

    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    
           xmlns:context="http://www.springframework.org/schema/context"   !!!!!
    
           xsi:schemaLocation="http://www.springframework.org/schema/beans
               http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
    
               http://www.springframework.org/schema/context     !!!!!
               http://www.springframework.org/schema/context/spring-context-2.5.xsd">  !!!!
               
          <context:annotation-config></context:annotation-config> //注册一个处理器
    </beans>

    @Autowired默认按类型查找,@Qualifier(" XXX")可以使其改变为按名查找;

    @Resource默认按名查找,找不到才按类型查找,如果设置了name属性,而又没有匹配到,则出错

    二,自动装配 

    <bean id="" class="" autowire="byType/byName/constructor/autodetect">
    </bean>

    byType:按类型,查找到多个会抛异常,没有为null,要setter方法,相当于@Autowired

    byName:@Resource

    constructor:也是按类型,不过是针对构造器的参数类型,即使是String类型也要在xml中配置

    autodetect:通过bean类的自省机制(introspection)决定用constructor还是byType来自动装配,如发现默认构造器,使用byType

    三,自动扫描机制

    在类路径下寻找标注了@Component,@Service,@Controller,@Repository注解的类(类上面加注解),将这些类纳入spring容器中管理。

    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    
           xmlns:context="http://www.springframework.org/schema/context"   !!!!!
    
           xsi:schemaLocation="http://www.springframework.org/schema/beans
               http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
    
               http://www.springframework.org/schema/context     !!!!!
               http://www.springframework.org/schema/context/spring-context-2.5.xsd">  !!!!
          
      //会注册很多处理器,包括了
    <context:annotation-config />的功能,还包括处理器例如用来解析@PostConstruct
    <context:component-scan base-package="com.maple"/>
      //base-package为需要扫描的包(含子包)
    </beans>

    @Component, 泛指组件,不好归类时用这个

    @Service, 标注业务层组件

    @Controller,标注控制层组件,如struts中的action

    @Repository,标注数据访问组件,即DAO层

    约定:如果PersonServiceBean类用了@Service注解,按该bean的id值默认为personServiceBean,

    即使用时

    @Test 
        public void instanceSpring2() throws Exception{
            AbstractApplicationContext context=new ClassPathXmlApplicationContext("beans.xml");
            //MapleClassPathXMLApplicationContext context=new MapleClassPathXMLApplicationContext("beans.xml");
            PersonService personService=(PersonService) context.getBean("personServiceBean");
            System.out.println(personService);
    }

    默认是单例作用域,可以使用注解@Scope("prototype")改为原型,则每次都是新的对象

    @PostConstruct注解 指定类初始化的方法,替代了以前配置bean时init-method的属性,是构造方法后执行的方法

    @PreDestroy, 销毁前执行的方法,替代了destroy-method

    有问题在公众号【清汤袭人】找我,时常冒出各种傻问题,然一通百通,其乐无穷,一起探讨


  • 相关阅读:
    SQL Server 存储过程
    String.format Tutorial
    第五次
    第四次
    第三次
    第一次作业
    第二次
    c/c++
    HelloWorld出现的问题
    Android系统架构
  • 原文地址:https://www.cnblogs.com/qingmaple/p/4051847.html
Copyright © 2011-2022 走看看