上一篇我们介绍了 Spring Framework IoC的Setter依赖注入,本篇我们一起来看一下Spring Framework IoC构造函数依赖注入。这里我总结了以下几种方式:
* 手动模式 | |
* XML资源配置元信息 | |
* Java 注解配置元信息 | |
* API配置元信息 | |
* 自动模式 | |
* Constructor |
接下来我们就通过实际案例一起来实战以下。代码如下:
<?xml version=".0" encoding="UTF-8"?> | |
<beans xmlns=" Spring framework.org/schema/beans" | |
xmlns:xsi="#; | |
xsi:schemaLocation=" | |
#;> | |
<import resource="classpath:/"/> | |
<bean class="org.eleven.thinking.in.spring.ioc.dependency.injection.UserHolder"> | |
<constructor-arg name="user" ref="superUser" /> | |
</bean> | |
</beans> | |
/* | |
* Licensed to the Apache Software Foundation (ASF) under one or more | |
* contributor license agreements. See the NOTICE file distributed with | |
* this work for additional information regarding copyright ownership. | |
* The ASF licenses this file to You under the Apache License, Version.0 | |
* (the "License"); you may not use this file except in compliance with | |
* the License. You may obtain a copy of the License at | |
* | |
* | |
* | |
* Unless required by applicable law or agreed to in writing, software | |
* distributed under the License is distributed on an "AS IS" BASIS, | |
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
* See the License for the specific language governing permissions and | |
* limitations under the License. | |
*/package org.eleven.thinking.in.spring.ioc.dependency.injection; | |
import org.springframework. Bean s.factory.support.DefaultListableBeanFactory; | |
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader; | |
/** | |
* 基于 XML 资源的依赖 Constructor 注入示例 | |
* | |
* @author <a href="mailto:eleven.hm@vip..com">eleven</a> | |
* @since | |
*/public class XmlDependencyConstructorInjectionDemo { | |
public static void main(String[] args) { | |
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory(); | |
XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory); | |
String xmlResourcePath = "classpath:/META-INF/dependency-constructor-injection.xml"; | |
// 加载 XML 资源,解析并且生成 BeanDefinition | |
beanDefinitionReader.loadBeanDefinitions(xmlResourcePath); | |
// 依赖查找并且创建 Bean | |
UserHolder userHolder = beanFactory.getBean(UserHolder.class); | |
System.out.println(userHolder); | |
} | |
} |
以上就是通过XML资源配置方式实现构造函数注入,这里我们可以看出,其实只需要将配置中的属性依赖改成 构造函数 依赖的方式就行了。接下来我们看一下注解配置资源的构造函数注入方式:
/* | |
* Licensed to the Apache Software Foundation (ASF) under one or more | |
* contributor license agreements. See the NOTICE file distributed with | |
* this work for additional information regarding copyright ownership. | |
* The ASF licenses this file to You under the Apache License, Version.0 | |
* (the "License"); you may not use this file except in compliance with | |
* the License. You may obtain a copy of the License at | |
* | |
* | |
* | |
* Unless required by applicable law or agreed to in writing, software | |
* distributed under the License is distributed on an "AS IS" BASIS, | |
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
* See the License for the specific language governing permissions and | |
* limitations under the License. | |
*/package org.eleven.thinking.in.spring.ioc.dependency.injection; | |
import org.eleven.thinking.in.spring.ioc.overview.domain.User; | |
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader; | |
import org.springframework.context. annotation .AnnotationConfigApplicationContext; | |
import org.springframework.context.annotation.Bean; | |
/** | |
* 基于 Java 注解的依赖 Constructor 注入示例 | |
* | |
* @author <a href="mailto:eleven.hm@vip..com">eleven</a> | |
* @since | |
*/public class AnnotationDependencyConstructorInjectionDemo { | |
public static void main(String[] args) { | |
// 创建 BeanFactory 容器 | |
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(); | |
// 注册 Configuration Class(配置类) | |
applicationContext.register(AnnotationDependencyConstructorInjectionDemo.class); | |
XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(applicationContext); | |
String xmlResourcePath = "classpath:/META-INF/dependency-lookup-context.xml"; | |
// 加载 XML 资源,解析并且生成 BeanDefinition | |
beanDefinitionReader.loadBeanDefinitions(xmlResourcePath); | |
// 启动 Spring 应用上下文 | |
applicationContext.refresh(); | |
// 依赖查找并且创建 Bean | |
UserHolder userHolder = applicationContext.getBean(UserHolder.class); | |
System.out.println(userHolder); | |
// 显示地关闭 Spring 应用上下文 | |
applicationContext.close(); | |
} | |
public UserHolder userHolder(User user) { | |
return new UserHolder(user); | |
} | |
} |
以上就是通过注解配置资源的方式来实现构造函数注入。接下来我们一起看一下通过 Java API 资源配置的方式来实现构造函数注入依赖,代码如下:
<?xml version=".0" encoding="UTF-8"?> | |
<beans xmlns="#; | |
xmlns:xsi="#; | |
xsi:schemaLocation=" | |
#;> | |
<import resource="classpath:/META-INF/dependency-lookup-context.xml"/> | |
<bean class="org.eleven.thinking.in.spring.ioc.dependency.injection.UserHolder" | |
autowire="constructor"> | |
<!-- <property name="user" ref="superUser" /> 替换成 autowiring 模式 --> | |
</bean> | |
</beans> | |
/* | |
* Licensed to the Apache Software Foundation (ASF) under one or more | |
* contributor license agreements. See the NOTICE file distributed with | |
* this work for additional information regarding copyright ownership. | |
* The ASF licenses this file to You under the Apache License, Version.0 | |
* (the "License"); you may not use this file except in compliance with | |
* the License. You may obtain a copy of the License at | |
* | |
* | |
* | |
* Unless required by applicable law or agreed to in writing, software | |
* distributed under the License is distributed on an "AS IS" BASIS, | |
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
* See the License for the specific language governing permissions and | |
* limitations under the License. | |
*/package org.eleven.thinking.in.spring.ioc.dependency.injection; | |
import org.springframework.beans.factory.config.BeanDefinition; | |
import org.springframework.beans.factory.support.BeanDefinitionBuilder; | |
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader; | |
import org.springframework.context.annotation.AnnotationConfigApplicationContext; | |
/** | |
* 基于 API 实现依赖 Constructor 注入示例 | |
* | |
* @author <a href="mailto:eleven.hm@vip..com">eleven</a> | |
* @since | |
*/public class ApiDependencyConstructorInjectionDemo { | |
public static void main(String[] args) { | |
// 创建 BeanFactory 容器 | |
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(); | |
// 生成 UserHolder 的 BeanDefinition | |
BeanDefinition userHolderBeanDefinition = createUserHolderBeanDefinition(); | |
// 注册 UserHolder 的 BeanDefinition | |
applicationContext.registerBeanDefinition("userHolder", userHolderBeanDefinition); | |
XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(applicationContext); | |
String xmlResourcePath = "classpath:/META-INF/dependency-lookup-context.xml"; | |
// 加载 XML 资源,解析并且生成 BeanDefinition | |
beanDefinitionReader.loadBeanDefinitions(xmlResourcePath); | |
// 启动 Spring 应用上下文 | |
applicationContext.refresh(); | |
// 依赖查找并且创建 Bean | |
UserHolder userHolder = applicationContext.getBean(UserHolder.class); | |
System.out.println(userHolder); | |
// 显示地关闭 Spring 应用上下文 | |
applicationContext.close(); | |
} | |
/** | |
* 为 {@link UserHolder} 生成 {@link BeanDefinition} | |
* | |
* @return | |
*/ private static BeanDefinition createUserHolderBeanDefinition() { | |
BeanDefinitionBuilder definitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(UserHolder.class); | |
definitionBuilder.addConstructorArgReference("superUser"); | |
return definitionBuilder.getBeanDefinition(); | |
} | |
// @Bean | |
// public UserHolder userHolder(User user) { // superUser -> primary = true | |
// UserHolder userHolder = new UserHolder(); | |
// userHolder.setUser(user); | |
// return userHolder; | |
// } | |
} |
以上是通过手动模式进行配置元信息的方式,接下来我们一起看一下通过自动模式配置元信息的方式,代码如下:
/* | |
* Licensed to the Apache Software Foundation (ASF) under one or more | |
* contributor license agreements. See the NOTICE file distributed with | |
* this work for additional information regarding copyright ownership. | |
* The ASF licenses this file to You under the Apache License, Version.0 | |
* (the "License"); you may not use this file except in compliance with | |
* the License. You may obtain a copy of the License at | |
* | |
* | |
* | |
* Unless required by applicable law or agreed to in writing, software | |
* distributed under the License is distributed on an "AS IS" BASIS, | |
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
* See the License for the specific language governing permissions and | |
* limitations under the License. | |
*/package org.eleven.thinking.in.spring.ioc.dependency.injection; | |
import org.springframework.beans.factory.support.DefaultListableBeanFactory; | |
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader; | |
/** | |
* "constructor" Autowiring 依赖构造器注入示例 | |
* | |
* @author <a href="mailto:eleven.hm@vip..com">eleven</a> | |
* @since | |
*/public class AutoWiringConstructorDependencyConstructorInjectionDemo { | |
public static void main(String[] args) { | |
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory(); | |
XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory); | |
String xmlResourcePath = "classpath:/META-INF/autowiring-dependency-constructor-injection.xml"; | |
// 加载 XML 资源,解析并且生成 BeanDefinition | |
beanDefinitionReader.loadBeanDefinitions(xmlResourcePath); | |
// 依赖查找并且创建 Bean | |
UserHolder userHolder = beanFactory.getBean(UserHolder.class); | |
System.out.println(userHolder); | |
} | |
} |
以上就是通过构造函数进行依赖注入的相关实践。