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.xsdhttp://www.springframework.org/schema/contexthttp://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.xsdhttp://www.springframework.org/schema/contexthttp://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.xsdhttp://www.springframework.org/schema/contexthttp://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.xsdhttp://www.springframework.org/schema/contexthttp://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.xsdhttp://www.springframework.org/schema/contexthttp://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层的beanpublic 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层的beanpublic 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

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

给TA打赏
共{{data.count}}人
人已打赏
Java

@Autowired的作用是什么?

2020-7-31 2:50:00

Java

什么是spring boot?为什么要用?

2020-7-31 2:53:20

本站所发布的一切源码、模板、应用等文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权。本站内容适用于DMCA政策。若您的权利被侵害,请与我们联系处理,站长 QQ: 84087680 或 点击右侧 私信:盾给网 反馈,我们将尽快处理。
⚠️
本站所发布的一切源码、模板、应用等文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权。本站内容适用于DMCA政策
若您的权利被侵害,请与我们联系处理,站长 QQ: 84087680 或 点击右侧 私信:盾给网 反馈,我们将尽快处理。
0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索