spring使用之旅(一) ---- bean的装配

基础配置

  • 启用组件扫描配置

Java类配置文件方式

package com.springapp.mvc.application;

import org.springframework.context.annotation.ComponentScan;

import org.springframework.context.annotation.Configuration;

/**

* Created by xuc on 2018/1/7.

* 配置类

*/

@ComponentScan(basePackages = {"com.springapp.mvc"})

@Configuration

public class Application {

}

注:此处@Configuration为声明该类为配置文件类,@ComponentScan为声明开启扫描功能,若未配置基础包属性,则默认扫描该配置类所在当前包,否则扫描基础包定义的包

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.xsd

http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

<context:component-scan base-package="com.springapp.mvc"/>

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">

<property name="prefix" value="/WEB-INF/pages/"/>

<property name="suffix" value=".jsp"/>

</bean>

</beans>

  • 手动装配bean

在大部分情况下我们都是使用组件扫描的的方式来装载bean,但有时候在使用第三方框架时,需要指定某些配置类,这种情况下通过手动配置则更加合适

Java类装配方式

package com.springapp.mvc.application;

import com.springapp.mvc.easyBean.Braves;

import com.springapp.mvc.easyBean.Sword;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.ComponentScan;

import org.springframework.context.annotation.Configuration;

/**

* Created by xuc on 2018/1/7.

* 配置类

*/

@ComponentScan(basePackages = {"com.springapp.mvc"})

@Configuration

public class Application {

@Bean(name = "braves")

public Braves braves() {

return new Braves(sword());

}

@Bean

public Braves braves1() {

Braves braves = new Braves();

braves.setSword(sword());

return braves;

}

@Bean

public Sword sword() {

return new Sword();

}

}

注:此处首先声明配置文件类,再通过在方法上@Bean注解,则spring将知道该方法会返回一个bean且注册到spring上下文中。@Bean注解若配置name属性,则Bean的ID为该值,否则默认和方法名一样。braves( ) 和braves1( ) 方法分别实现了构造函数注入和set方式注入

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.xsd

http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

<context:component-scan base-package="com.springapp.mvc"/>

<bean class="com.springapp.mvc.easyBean.Sword" id="sword"></bean>

<bean class="com.springapp.mvc.easyBean.Braves" id="braves">

<constructor-arg ref="sword"></constructor-arg>

</bean>

<bean class="com.springapp.mvc.easyBean.Braves" id="braves1">

<property name="sword" ref="sword"></property>

</bean>

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">

<property name="prefix" value="/WEB-INF/pages/"/>

<property name="suffix" value=".jsp"/>

</bean>

</beans>

braves bean 和 braves1 bean分别实现了构造函数注入和set方式注入.

  • Java类和xml文件混合配置(单或多)

Java类配置

package com.springapp.mvc.application;

import com.springapp.mvc.easyBean.Sword;

import org.springframework.context.annotation.*;

/**

* Created by xuc on 2018/1/7.

* 配置类

*/

@ComponentScan(basePackages = {"com.springapp.mvc"})

@Configuration

@Import(Application1.class)

@ImportResource("classpath:mvc-dispatcher-servlet.xml")

public class Application {

@Bean

public Sword sword() {

return new Sword();

}

}

注:此处@Import 注解为导入配置java类,@ImportResource注解为导入配置xml文件,此处可配置多个,通过都好隔开

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.xsd

http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

<context:component-scan base-package="com.springapp.mvc"/>

<import resource="mvc-dispatcher-servlet1.xml"></import>

<bean class="com.springapp.mvc.application.Application"></bean>

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">

<property name="prefix" value="/WEB-INF/pages/"/>

<property name="suffix" value=".jsp"/>

</bean>

</beans>

条件配置

  • spring profile 实现跨环境配置

1.配置profile bean

java类配置

package com.springapp.mvc.application;

import ...

/**

* Created by xuc on 2018/1/7.

* 配置类

*/

@ComponentScan(basePackages = {"com.springapp.mvc"})

@Configuration

public class Application {

@Bean

public Braves braves(IArms arms){

return new Braves(arms);

}

@Bean

@Profile("dev")

public Sword sword() {

return new Sword();

}

@Bean

@Profile("test")

public Machete machete(){

return new Machete();

}

}

注:通过@Profile注解声明该bean属于哪种环境下的(常见于数据库连接操作)

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.xsd

http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

<context:component-scan base-package="com.springapp.mvc"/>

<beans profile="dev">

<bean class="com.springapp.mvc.easyBean.Sword"></bean>

</beans>

<beans profile="test">

<bean class="com.springapp.mvc.easyBean.Machete"></bean>

</beans>

<beans>

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">

<property name="prefix" value="/WEB-INF/pages/"/>

<property name="suffix" value=".jsp"/>

</bean>

</beans>

</beans>

2.激活spring profile

<web-app version="2.4"

xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee

http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

<display-name>Spring MVC Application</display-name>

<context-param>

<param-name>spring.profiles.default</param-name>

<param-value>dev</param-value>

</context-param>

<servlet>

<servlet-name>mvc-dispatcher</servlet-name>

<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

<init-param>

<param-name>spring.profiles.default</param-name>

<param-value>dev</param-value>

</init-param>

<load-on-startup>1</load-on-startup>

</servlet>

<servlet-mapping>

<servlet-name>mvc-dispatcher</servlet-name>

<url-pattern>/</url-pattern>

</servlet-mapping>

</web-app>

注:在web应用中,只需配置spring.profiles.default 或 spring.profiles.active,前者为默认后者为激活

3.测试一下

在配置“dev”的情况下,只会有sword bean存在,使用machete bean则会报类不存在异常!

  • condition实现条件注册bean

定义一个实现condition接口的类,实现matches( )方法,在方法里面做校验判断

package com.springapp.mvc.application;

import org.springframework.context.annotation.Condition;

import org.springframework.context.annotation.ConditionContext;

import org.springframework.core.env.Environment;

import org.springframework.core.type.AnnotatedTypeMetadata;

/**

* Created by xuc on 2018/1/7.

* 条件判断bean是否创建

*/

public class AppCondition implements Condition {

@Override

public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {

Environment environment = conditionContext.getEnvironment();

if (environment.acceptsProfiles("dev") || environment.acceptsProfiles("test")){

return true;

}

return false;

}

}

注:@profile注解value校验就是通过condition实现的,ProfileCondition为其实现类如下:

@Retention(RetentionPolicy.RUNTIME)

@Target({ElementType.TYPE, ElementType.METHOD})

@Documented

@Conditional(ProfileCondition.class)

public @interface Profile {

/**

* The set of profiles for which the annotated component should be registered.

*/

String[] value();

}

class ProfileCondition implements Condition {

@Override

public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {

if (context.getEnvironment() != null) {

MultiValueMap<String, Object> attrs = metadata.getAllAnnotationAttributes(Profile.class.getName());

if (attrs != null) {

for (Object value : attrs.get("value")) {

if (context.getEnvironment().acceptsProfiles(((String[]) value))) {

return true;

}

}

return false;

}

}

return true;

}

}

  • bean注入歧义性问题

1.在待注入bean上加@Primary注解,声明该bean为优先注入

package com.springapp.mvc.application;

import com.springapp.mvc.easyBean.Braves;

import com.springapp.mvc.easyBean.IArms;

import com.springapp.mvc.easyBean.Machete;

import com.springapp.mvc.easyBean.Sword;

import org.springframework.context.annotation.*;

/**

* Created by xuc on 2018/1/7.

* 配置类

*/

@ComponentScan(basePackages = {"com.springapp.mvc"})

@Configuration

public class Application {

@Bean

@Conditional(AppCondition.class)

public Braves braves(IArms arms){

return new Braves(arms);

}

@Bean

@Profile("dev")

@Primary

public Sword sword() {

return new Sword();

}

@Bean

@Profile("test")

public Machete machete(){

return new Machete();

}

}

2.在被注入bean上加@Qualifier注解

package com.springapp.mvc.application;

import com.springapp.mvc.easyBean.Braves;

import com.springapp.mvc.easyBean.IArms;

import com.springapp.mvc.easyBean.Machete;

import com.springapp.mvc.easyBean.Sword;

import org.springframework.beans.factory.annotation.Qualifier;

import org.springframework.context.annotation.*;

/**

* Created by xuc on 2018/1/7.

* 配置类

*/

@ComponentScan(basePackages = {"com.springapp.mvc"})

@Configuration

public class Application {

@Bean

@Qualifier("sword")

public Braves braves(IArms arms){

return new Braves(arms);

}

@Bean

@Profile("dev")

public Sword sword() {

return new Sword();

}

@Bean

@Profile("test")

public Machete machete(){

return new Machete();

}

}

注:此处若存在多个(即多优先级),可自定义注解

  • bean的作用域
作用域 描述
singleton 该作用域将 bean 的定义的限制在每一个 Spring IoC 容器中的一个单一实例(默认)。
prototype 该作用域将单一 bean 的定义限制在任意数量的对象实例。
request 该作用域将 bean 的定义限制为 HTTP 请求。只在 web-aware Spring ApplicationContext 的上下文中有效。
session 该作用域将 bean 的定义限制为 HTTP 会话。 只在web-aware Spring ApplicationContext的上下文中有效。
global-session 该作用域将 bean 的定义限制为全局 HTTP 会话。只在 web-aware Spring ApplicationContext 的上下文中有效。

package com.springapp.mvc.application;

import com.springapp.mvc.easyBean.Braves;

import com.springapp.mvc.easyBean.IArms;

import com.springapp.mvc.easyBean.Machete;

import com.springapp.mvc.easyBean.Sword;

import org.springframework.beans.factory.annotation.Qualifier;

import org.springframework.context.annotation.*;

import org.springframework.web.context.WebApplicationContext;

/**

* Created by xuc on 2018/1/7.

* 配置类

*/

@ComponentScan(basePackages = {"com.springapp.mvc"})

@Configuration

public class Application {

@Bean

public Braves braves(IArms arms){

return new Braves(arms);

}

@Bean

@Profile("dev")

@Scope(value = WebApplicationContext.SCOPE_GLOBAL_SESSION,

proxyMode = ScopedProxyMode.TARGET_CLASS)

public Sword sword() {

return new Sword();

}

@Bean

@Profile("test")

public Machete machete(){

return new Machete();

}

}

注:此处通过@Scope注解重新定义sword bean为会话级作用域,由于在使用braves时会优先加载sword,通过proxyMode声明代理该类,

即通过延迟注入的形式实现session级的sword注入到单例级的braves。如果该是接口的话:“proxyMode = ScopedProxyMode.INTERFACES”

GitHub地址:https://github.com/xc83415134/spring_bean_demo

环境: IDEA、Spring4.0

参考资料: 《spring实战》

原文地址:https://www.cnblogs.com/njxc/p/8313388.html

时间: 2024-08-30 18:31:44

spring使用之旅(一) ---- bean的装配的相关文章

Spring框架第一篇之Bean的装配

一.默认装配方式 代码通过getBean();方式从容器中获取指定的Bean实例,容器首先会调用Bean类的无参构造器,创建空值的实例对象. 举例: 首先我在applicationContext.xml配置文件中配置了一个bean: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" x

《Spring实战》系列之Bean的装配-Days01

1 自动化装配bean Spring通过两个方面实现对bean的自动装配 1 ) 组件扫描(component scaning):Spring会自动发现Spring上下文中的bean 2 ) 自动装配(autowriting):Spring自动满足bean之间的依赖 1.1 创建可被发现的bean 现在我们创建一个接口: public interface CompactDisc { void play(); } 接着来一个实现类: import org.springframework.stere

spring初级知识讲解(一)装配Bean

序,Spring的依赖注入是学习spring的基础.IOC为控制反转,意思是需要的时候就由spring生成一个,而不是先生成再使用. 写在前面 Spring提供面向接口编程,面向接口编程与依赖注入协作实现了松散耦合. Spring.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"

Spring bean依赖注入、bean的装配及相关注解

依赖注入 Spring主要提供以下两种方法用于依赖注入 基于属性Setter方法注入 基于构造方法注入 Setter方法注入 例子: public class Communication { private Messaging messaging; /* * DI via Setter */ public void setMessaging(Messaging messaging){ this.messaging = messaging; } public void communicate(){

Spring笔记2——Spring中Bean的装配

1.引言 Spring中,对象无需自己负责查找或创建与其关联的其他对象,而是由容器负责把需要相互协作的对象引用赋予各个对象.创建应用对象之间的协作关系的行为通常称为装配(Wiring),这也是依赖注入的本质. 2.声明Bean 配置Bean的方式主要有两种:基于XML文件的配置方式和基于Java注解的配置方式.传统的基于XML文件的配置方式在声明Bean时,Spring配置文件的根元素来源于Spring beans命名空间所定义的<beans>元素.除了beans命名空间外,Java自带了多种

Spring -- Bean自动装配&amp;Bean之间关系&amp;Bean的作用域

Bean的自动装配 Spring IOC 容器可以自动装配 Bean. 需要做的仅仅是在 的 autowire 属性里指定自动装配的模式 有以下几种自动装配的类型: byType(根据类型自动装配): 若 IOC 容器中有多个与目标 Bean 类型一致的 Bean. 在这种情况下, Spring 将无法判定哪个 Bean 最合适该属性, 所以不能执行自动装配. byName(根据名称自动装配): 必须将目标 Bean 的名称和属性名设置的完全相同. constructor(通过构造器自动装配):

Spring学习系列(三) 通过Java代码装配Bean

上面梳理了通过注解来隐式的完成了组件的扫描和自动装配,下面来学习下如何通过显式的配置的装配bean 二.通过Java类装配bean 在前面定义了HelloWorldConfig类,并使用@ComponentScan和@Configuration注解,@Configuration注解表明了这个类是一个java配置类,该类用在获取Spring应用上下文时,告诉Spring创建bean的细节,通过@ComponentScan,我们启用了Spring的自动组件扫描,现在就让我们来看如果通过java类来显

Spring 之Bean的装配

Spring Bean的装配分为3中: 1.隐式发现和自动装配 @Component:将一个Java类声明为Bean(组件类),等待Spring扫描发现. @ComponentScan:启用组件扫描将带有@Component的类实例化为Bean,一般用在配置类上,可指定扫描基础包,默认与配置类相同的包. @Configuration:声明一个Java类是配置类,它与@Component作用相当,只是更为直观,一般@Bean与其连用. <context:component-scan base-pa

Spring温故而知新 - bean的装配(续)

按条件装配bean 就是当满足特定的条件时Spring容器才创建Bean,Spring中通过@Conditional注解来实现条件化配置bean package com.sl.ioc; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.

Spring学习(六)bean装配详解之 【通过注解装配 Bean】【基础配置方式】

通过注解装配 Bean 1.前言 优势 1.可以减少 XML 的配置,当配置项多的时候,XML配置过多会导致项目臃肿难以维护 2.功能更加强大,既能实现 XML 的功能,也提供了自动装配的功能,采用了自动装配后,程序猿所需要做的决断就少了,更加有利于对程序的开发,这就是“约定优于配置”的开发原则 IOC发现Bean的两种方式 组件扫描:通过定义资源的方式,让 Spring IoC 容器扫描对应的包,从而把 bean 装配进来. 自动装配:通过注解定义,使得一些依赖关系可以通过注解完成. 2.使用