• spring常用的注入方式有哪些?


    1、xml中配置

    • bean 的申明、注册

    <bean> 节点注册 bean
    <bean> 节点的 factory-bean 参数指工厂 bean,factory-method 参数指定工厂方法

    • bean 的注入

    <property> 节点使用 set 方式注入
    <constructor-arg> 节点使用 构造方法注入

    实测代码

    maven pom 文件 

    <dependency>
    	<groupId>org.springframework</groupId>
    	<artifactId>spring-beans</artifactId>
    	<version>4.2.4.RELEASE</version>
    </dependency>
    
    <dependency>
    	<groupId>org.springframework</groupId>
    	<artifactId>spring-context</artifactId>
    	<version>4.2.4.RELEASE</version>
    </dependency>

    a) <bean> + <property>,set方法注入

    class Bowl

    package constxiong.interview.inject;
    
    public class Bowl {
    
    	public void putRice() {
    		System.out.println("盛饭...");
    	}
    
    }
    

    class Person

    package constxiong.interview.inject;
    
    public class Person {
    
    	private Bowl bowl;
    	
    	public void eat() {
    		bowl.putRice();
    		System.out.println("开始吃饭...");
    	}
    
    	public void setBowl(Bowl bowl) {
    		this.bowl = bowl;
    	}
    	
    }

    spring 配置文件

    <?xml version="1.0" encoding="UTF-8"?>
    <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.xsd
    	    http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context.xsd">
            
    	<bean id="bowl" class="constxiong.interview.inject.Bowl" />
    	
    	<bean id="person" class="constxiong.interview.inject.Person">
    		<property name="bowl" ref="bowl"></property>
    	</bean>
    	
    </beans>

    测试类

    package constxiong.interview.inject;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class InjectTest {
    
    	public static void main(String[] args) {
    		ApplicationContext context = new ClassPathXmlApplicationContext("spring_inject.xml");
    		Person person = (Person)context.getBean("person");
    		person.eat();
    	}
    }
    

     b) 修改为 配置文件和class Person,<bean> + <constructor-arg> 节点使用 构造方法注入

    class Person

    package constxiong.interview.inject;
     
    public class Person {
     
    	private Bowl bowl;
    	
    	public Person(Bowl bowl) {
    		this.bowl = bowl;
    	}
    	
    	public void eat() {
    		bowl.putRice();
    		System.out.println("开始吃饭...");
    	}
    	
    }

    spring 配置文件

    <?xml version="1.0" encoding="UTF-8"?>
    <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.xsd
    	    http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context.xsd">
            
    	<bean id="bowl" class="constxiong.interview.inject.Bowl" />
    	
    	<bean id="person" class="constxiong.interview.inject.Person">
    		<constructor-arg name="bowl" ref="bowl"></constructor-arg>
    	</bean>
    	
    </beans>

    c) <bean> 节点 factory-method 参数指定静态工厂方法

    工厂类,静态工厂方法

    package constxiong.interview.inject;
     
    public class BowlFactory {
     
    	public static final Bowl getBowl() {
    		return new Bowl();
    	}
    	
    }

    spring 配置文件

    <?xml version="1.0" encoding="UTF-8"?>
    <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.xsd
    	    http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context.xsd">
            
    	<bean id="bowl" class="constxiong.interview.inject.BowlFactory" factory-method="getBowl"/>
    	
    	<bean id="person" class="constxiong.interview.inject.Person">
    		<constructor-arg name="bowl" ref="bowl"></constructor-arg>
    	</bean>
    	
    </beans>

    d) 非静态工厂方法,需要指定工厂 bean 和工厂方法

    工厂类,非静态工厂方法

    package constxiong.interview.inject;
     
    public class BowlFactory {
     
    	public Bowl getBowl() {
    		return new Bowl();
    	}
    	
    }

    配置文件

    <?xml version="1.0" encoding="UTF-8"?>
    <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.xsd
    	    http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context.xsd">
        
        <bean id="bowlFactory" class="constxiong.interview.inject.BowlFactory"></bean>   
    	<bean id="bowl" factory-bean="bowlFactory" factory-method="getBowl"/>
    	
    	<bean id="person" class="constxiong.interview.inject.Person">
    		<constructor-arg name="bowl" ref="bowl"></constructor-arg>
    	</bean>
    	
    </beans>

    2、注解

    • bean 的申明、注册

    @Component //注册所有bean
    @Controller //注册控制层的bean
    @Service //注册服务层的bean
    @Repository //注册dao层的bean

    • bean 的注入

    @Autowired 作用于 构造方法、字段、方法,常用于成员变量字段之上。
    @Autowired + @Qualifier 注入,指定 bean 的名称
    @Resource JDK 自带注解注入,可以指定 bean 的名称和类型等

    测试代码

    e) spring 配置文件,设置注解扫描目录

    <?xml version="1.0" encoding="UTF-8"?>
    <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.xsd
    	    http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context.xsd">
            
    	<context:component-scan base-package="constxiong.interview" />
    	
    </beans>

    class Bowl

    package constxiong.interview.inject;
     
    import org.springframework.stereotype.Component;
    //import org.springframework.stereotype.Controller;
    //import org.springframework.stereotype.Repository;
    //import org.springframework.stereotype.Service;
     
    @Component //注册所有bean
    //@Controller //注册控制层的bean
    //@Service //注册服务层的bean
    //@Repository //注册dao层的bean
    public class Bowl {
     
    	public void putRice() {
    		System.out.println("盛饭...");
    	}
     
    }

    class Person

    package constxiong.interview.inject;
     
    //import javax.annotation.Resource;
    //
    import org.springframework.beans.factory.annotation.Autowired;
    //import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.stereotype.Component;
     
    @Component //注册所有bean
    //@Controller //注册控制层的bean
    //@Service //注册服务层的bean
    //@Repository //注册dao层的bean
    public class Person {
     
    	@Autowired
    //	@Qualifier("bowl")
    //	@Resource(name="bowl")
    	private Bowl bowl;
     
    	public void eat() {
    		bowl.putRice();
    		System.out.println("开始吃饭...");
    	}
    	
    }

    测试类同上

    a、b、c、d、e 测试结果都ok

    盛饭...
    开始吃饭...


    原文链接
     


     

  • 相关阅读:
    购物菜单
    增删改查
    第七次Android
    第七次作业
    第四次作业
    第二次作业
    第七次
    第二次作业
    第三次作业
    第六周安卓作业
  • 原文地址:https://www.cnblogs.com/ConstXiong/p/12117961.html
Copyright © 2020-2023  润新知