《Spring攻略》 第2章 高级Spring IoC容器

安卓ai自动化脚本 Yyds.Auto实现 示例 纯ai图像识别自动点击脚本 纯ai识别实现自动化脚本 阅读详情

1调用静态工厂方法创建Bean

问题:
你打算调用一个静态工厂方法在Spring IoC容器中创建一个Bean,静态工厂方法的目的是在静态方法中封装对象创建过程。

解决方案:
Spring支持调用一个静态工厂方法创建Bean,这个方法应该在factory-method属性中指定。

工作原理:
factory-method

public class ProductCreator {
	public static Product createProduct(int productId){
		if(1 == productId){
			return new Product("xiaomei", 16);
		}else if(2 == productId){
			return new Product("xiaolang", 15);
		}
		throw new IllegalArgumentException("Unknown product");
	}
}

<bean id="productCreator1" class="com.partner4java.spring.factorymethod.ProductCreator"
	factory-method="createProduct">
	<constructor-arg value="1" />
</bean>

<bean id="productCreator2" class="com.partner4java.spring.factorymethod.ProductCreator"
	factory-method="createProduct">
	<constructor-arg value="2" />
</bean>

@Test
public void testFactoryMethod(){
	System.out.println(applicationContext.getBean("productCreator1"));
	System.out.println(applicationContext.getBean("productCreator2"));
}


2调用一个实例工厂方法创建Bean

问题:
你打算调用一个实例工厂方法在Spring IoC容器中创建一个Bean,目的是在另一个对象实例的一个方法中封装对象创建过程。
请求对象的客户可以简单地调用这个方法,不需要了解创建的细节。

解决方案:
Spring支持调用实例工厂方法创建Bean。Bean实例在factory-bean属性中指定,而工厂方法应该在factory-method属性中指定。

工作原理:
factory-bean

package com.partner4java.spring.factorybean;

import java.util.Map;

import com.partner4java.spring.factorymethod.Product;

public class ProductCreator {
	private Map<String, Product> products;

	public void setProducts(Map<String, Product> products) {
		this.products = products;
	}
	
	public Product createProduct(String productId){
		Product product = products.get(productId);
		if(product != null){
			return product;
		}
		throw new IllegalArgumentException("Unknown product");
	}
}

<bean id="productCreator" class="com.partner4java.spring.factorybean.ProductCreator">
	<property name="products">
		<map>
			<entry key="gaofumei">
				<bean class="com.partner4java.spring.factorymethod.Product">
					<constructor-arg value="gaofumei" name="name"/>
					<constructor-arg value="100" name="price"/>
				</bean>
			</entry>
			<entry key="xiaoneinv">
				<bean class="com.partner4java.spring.factorymethod.Product">
					<constructor-arg value="xiaoneinv" name="name"/>
					<constructor-arg value="200" name="price"/>
				</bean>
			</entry>
		</map>
	</property>
</bean>

<bean id="gaofumei" factory-bean="productCreator" factory-method="createProduct">
	<constructor-arg value="gaofumei"/>
</bean>

<bean id="xiaoneinv" factory-bean="productCreator" factory-method="createProduct">
	<constructor-arg value="xiaoneinv"/>
</bean>

@Test
public void testFactoryMethod(){
	System.out.println(applicationContext.getBean("gaofumei"));
	System.out.println(applicationContext.getBean("xiaoneinv"));
}


3从静态字段中声明bean

问题:
你打算从一个静态字段中声明Spring IoC容器中的一个Bean。在Java中,常量值往往声明为静态字段。

解决方案:
为了从静态字段中声明Bean,你可以使用内建的工厂Bean FieldRetrievingFactoryBean,或者Spring 2.X中的<util:contant>标记。

工作原理:
public class ProductConstant {
	public static Product gaofumei = new Product("gaofumei", 100);
	public static Product xiaoneinv = new Product("xiaoneinv", 200);
}

<util:constant id="gaofumei"
	static-field="com.partner4java.spring.constant.ProductConstant.gaofumei" />

<util:constant id="xiaoneinv"
	static-field="com.partner4java.spring.constant.ProductConstant.xiaoneinv" />

@Test
public void testFactoryMethod(){
	System.out.println(applicationContext.getBean("gaofumei"));
	System.out.println(applicationContext.getBean("xiaoneinv"));
}


4从对象属性中声明bean

问题:
你打算从一个对象属性或者嵌套的属性(也就是属性路径)中声明Spring IoC容器中的一个Bean。

解决方案:
为了从一种对象属性或者属性路径中声明Bean,可以使用内建的工厂Bean PropertyPathFactoryBean或者Spring 2.X中的<util:property-path>标记。

工作原理:
public class ProductProperty {
	private Product gaofumei;
	private Product xiaonennv;
	
	public Product getGaofumei() {
		return gaofumei;
	}
	public void setGaofumei(Product gaofumei) {
		this.gaofumei = gaofumei;
	}
	public Product getXiaonennv() {
		return xiaonennv;
	}
	public void setXiaonennv(Product xiaonennv) {
		this.xiaonennv = xiaonennv;
	}
	
}

<bean id="productProperty" class="com.partner4java.spring.property.ProductProperty">
	<property name="gaofumei">
		<bean class="com.partner4java.spring.factorymethod.Product">
			<constructor-arg name="name" value="gaofumei"/>
			<constructor-arg name="price" value="100.1"/>
		</bean>
	</property>
	<property name="xiaonennv">
		<bean class="com.partner4java.spring.factorymethod.Product">
			<constructor-arg name="name" value="xiaonennv"/>
			<constructor-arg name="price" value="200.2"/>
		</bean>
	</property>
</bean>

<util:property-path id="gaofumei" path="productProperty.gaofumei"/>
<util:property-path id="xiaonennv" path="productProperty.xiaonennv"/>


5使用Spring表达式语言

问题:
你希望动态的评估一些条件或者属性,并且将其作为IoC容器中的配置值使用。
你也可能因为自定义范围的情况,必须将某些估值从设计时延迟到运行时。
或者你只是需要一种行为自己的应用添加强大的表达式语言。


解决方案:
使用Spring 3.0的Spring表达式语言(SpEL),这种语言提供了与JSF和JSP中的Unified EL或者对象图形导航语言(OGNL)相似的功能。
SpEL提供了易用的基础架构,可以在Spring容器之外使用。


工作原理:



6设置Bean作用域

问题:
当你在配置文件中声明Bean时,实际上定义了Bean创建的一个模板,而不是实际的Bean实例。
当getBean()方法或者其他的Bean的一个引用请求Bean时,Spring将根据Bean作用域(Scope)确定应该返回的Bean实例。
有时候,你必须为Bean设置正确的作用域而不是默认的作用域。( By default, a bean will be a singleton)


解决方案:
作用域 描述 
singleton 
 在每个Spring IoC容器中一个bean定义对应一个对象实例。
 
prototype 
 一个bean定义对应多个对象实例。
 
request 
 在一次HTTP请求中,一个bean定义对应一个实例;即每次HTTP请求将会有各自的bean实例, 它们依据某个bean定义创建而成。该作用域仅在基于web的Spring ApplicationContext情形下有效。
 
session 
 在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。
 
global session 
 在一个全局的HTTP Session中,一个bean定义对应一个实例。典型情况下,仅在使用portlet context的时候有效。该作用域仅在基于web的Spring ApplicationContext情形下有效。


7自定义Bean初始化和析构

问题 :
许多现实世界中的组件在使用之前必须进行某种初始化任务。
在组件的声明周期结束时,也必须要执行相应的任务。

解决方案:
除了注册Bean之外,Spring IoC容器还负责管理Bean的声明周期,允许你在他们的生命期特定时点执行自定义任务。
你的任务应该封装在回调方法中,由Spring IoC容器在核实的时候调用。

Spring IoC容器管理Bean周期的步骤:
1、构造程序或者工厂方法创建Bean实例。
2、向Bean属性设置值和Bean引用。
3、调用初始化回调方法。
4、Bean就绪。
5、容器关闭时,调用析构回调方法。

工作原理:
方法一:实现约定接口
public class Work implements InitializingBean,DisposableBean {

	@Override
	public void destroy() throws Exception {
		System.out.println("离职");
	}
	
	public void vork(){
		System.out.println("working");
	}

	@Override
	public void afterPropertiesSet() throws Exception {
		System.out.println("入职");
	}

}
<bean id="work" class="com.partner4java.spring.initdes.Work"
		scope="prototype" />

方法二:配置文件声明		
public class Work1 {

	public void destroy() throws Exception {
		System.out.println("离职");
	}
	
	public void vork(){
		System.out.println("working");
	}

	public void afterPropertiesSet() throws Exception {
		System.out.println("入职");
	}

}
<bean id="work1" class="com.partner4java.spring.initdes.Work1"
		init-method="afterPropertiesSet" destroy-method="destroy" scope="prototype" />
	
方法三:注解声明
public class Work2 {

	@PreDestroy
	public void destroy() throws Exception {
		System.out.println("离职");
	}
	
	public void vork(){
		System.out.println("working");
	}

	@PostConstruct
	public void afterPropertiesSet() throws Exception {
		System.out.println("入职");
	}

}

<context:annotation-config/>	
<bean id="work2" class="com.partner4java.spring.initdes.Work2"
	scope="prototype" />		


8用Java Config简化XML配置

问题:
你欣赏DI容器的能力,但是希望覆盖一些配置,或者只是希望将更多的配置从XML格式中转移到Java中,可以更好的从重构和类型安全性中获益。


解决方案:
你可以使用Java Config。


工作原理:
Java Config支持强大的,代表了与其他通过XML或者注解的配置选项完全不同的工作方式。
重要的是,Java Config可以与现有方式混合使用。
启用Java配置的最简单方法是使用简单的XML配置文件。


@Configuration标记类:Spring将在类中寻找@Bean定义,指定这个标记@Bean的方法为一个Bean。(也就是指定某个方法返回为一个Bean)


@Lazy:将Bean的构造推迟到必须满足依赖或者应用上下文中显示的访问时。
@DependsOn:指定一个Bean的创建必须在其他Bean创建之后。
@Primary:指定相同接口的多个Bean。


@Import、@Value...


9使Bean感知容器

问题:
一个精心设计的组件应该没有对容器的直接依赖。
但是,有时候Bean有必要了解容器的资源。

解决方案:
Spring将通过一些接口定义的设置方法将对应资源注入到你的Bean中。
Spring中的常见感知接口
感知接口				目标资源
BeanNameAware		IoC容器中配置的实例的Bean名称
BeanFactoryAware	当前的Bean工厂,通过它你可以调用容器的服务。
ApplicationContextAware*	当前应用上下文,通过他你可以调用容器的服务。
MessageSourceAware	消息资源,通过他可以解析文本消息。
ApplicationEventPublisherAware	应用事件发布者,通过他你可以发布应用事件。
ResourceLoaderAware	资源装载器,通过他可以加载外部资源。

你可以实现这些接口,然后试试看你都能获得什么。

工作原理:
public class HelloBeanNameAware implements BeanNameAware {
	private String name;
	
	@Override
	public void setBeanName(String name) {
		this.name = name;
	}

	@Override
	public String toString() {
		return "HelloBeanNameAware [name=" + name + "]";
	}
}

public class HelloBeanFactoryAware implements BeanFactoryAware {
	private BeanFactory beanFactory;
	
	@Override
	public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
		this.beanFactory = beanFactory;
	}

	@Override
	public String toString() {
		return "HelloBeanFactoryAware [beanFactory=" + beanFactory.getClass().getSimpleName() + "]";
	}

}

public class HelloApplicationContextAware implements ApplicationContextAware {
	private ApplicationContext applicationContext;
	
	@Override
	public void setApplicationContext(ApplicationContext applicationContext)
			throws BeansException {
		this.applicationContext = applicationContext;
	}

	@Override
	public String toString() {
		return "HelloApplicationContextAware [applicationContext="
				+ applicationContext.getClass().getSimpleName() + "]";
	}
	
}


<bean id="helloBeanNameAware" class="com.partner4java.spring.aware.HelloBeanNameAware" />

<bean id="helloBeanFactoryAware" class="com.partner4java.spring.aware.HelloBeanFactoryAware" />

<bean id="helloApplicationContextAware" class="com.partner4java.spring.aware.HelloApplicationContextAware" />

@Test
public void testAware() throws InterruptedException{
	System.out.println(applicationContext.getBean("helloBeanNameAware"));
	System.out.println(applicationContext.getBean("helloBeanFactoryAware"));
	System.out.println(applicationContext.getBean("helloApplicationContextAware"));
	// 后台打印:
	// HelloBeanNameAware [name=helloBeanNameAware]
	// HelloBeanFactoryAware [beanFactory=DefaultListableBeanFactory]
	// HelloApplicationContextAware
	// [applicationContext=ClassPathXmlApplicationContext]
}	


10加载外部资源

问题:
有时候,你的应用可能需要从不同位置(例如文件系统、classpath或者URL)读取外部资源(例如文本文件、XML文件、属性文件或者图像文件)。
通常,你必须处理用于从不同位置加载资源的不同API。

解决方案:
Spring的资源装载器提供统一的getResoure()方法,按照资源路径读取外部资源。你可以为路径指定不同的前缀从不同位置加载资源。
为了从文件系统加载资源,使用file前缀。
从classpath加载资源则使用classpath前缀。
你还可以在资源路径中指定一个URL。

Resource是Spring中代表外部资源的通用接口。Spring提供Resource接口的多个实现。
资源装载器的getResource()方法根据资源路径决定实例化哪一个Resource实现。

工作原理:
方式一:实现接口ResourceLoaderAware(感知接口)
public class HelloResourceLoader implements ResourceLoaderAware {
	private ResourceLoader resourceLoader;
	@Override
	public void setResourceLoader(ResourceLoader resourceLoader) {
		this.resourceLoader = resourceLoader;
	}

	public void showResource() throws IOException {
		Resource resource = resourceLoader.getResource("file:D:/cc.txt");
		BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(resource.getInputStream()));
		String s = null;
		while((s = bufferedReader.readLine()) != null){
			System.out.println(s);
		}
	}
}

<bean id="helloResourceLoader" class="com.partner4java.spring.resource.HelloResourceLoader"
	init-method="showResource" />

获取bean,会注入感知接口的资源,并执行初始化方法。

方式二:
简单的指定这个Resource属性的资源路径,Spring将使用预先注册属性编辑器ResourceEditor将这个属性转换为一个Resource对象,然后注入你的Bean中。
public class HelloSimpleResourceLoader {
	private Resource resource;

	public void setResource(Resource resource) {
		this.resource = resource;
	}
	
	public void showResource() throws IOException {
		BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(resource.getInputStream()));
		String s = null;
		while((s = bufferedReader.readLine()) != null){
			System.out.println(s);
		}
	}
}

<bean id="helloSimpleResourceLoader"
	class="com.partner4java.spring.resource.HelloSimpleResourceLoader"
	init-method="showResource">
	<property name="resource">
		<value>classpath:com/partner4java/spring/App.class</value>
	</property>
</bean>


11创建Bean后处理器

问题:
你希望在Spring IoC容器中注册自己的插件,在构造期间处理Bean实例。

解决方案:
Bean后处理器允许在初始化回调方法前后进行附加的Bean处理。
Bean后处理器的主要特性是逐个处理IoC容器中的所有Bean实例,而不是单个Bean实例。
一般,Bean后处理器用于检查Bean属性有效性,或者根据特殊条件修改Bean属性。

Bean后处理器的基本要求是实现BeanPostProcessor接口。
你可以实现postProcessBeforeInitialization()和postProcessAfterInitialization()方法,在初始化回调方法前后处理所有Bean。
然后,Spring将在调用初始化回调方法前后向这两个方法传递每个Bean实例。
步骤如下:
1、构造程序或者工厂方法创建Bean实例。
2、为Bean属性设置值和Bean引用。
3、调用感知接口中定义的设置方法。
4、将Bean实例传递给每个Bean前置处理器中的postProcessBeforeInitialization方法。
5、调用初始化回调方法。
6、讲Bean实例传递给每个Bean后处理器中的postProcessAfterInitialization方法。
7、Bean准备就绪,可以使用。
8、容器关闭时,调用析构回调方法。
使用Bean工厂为IoC容器时,Bean后处理器只能编程注册,更准确的讲是通过addBeanPostProcessor()方法注册。
但是,如果你使用一个应用上下文,注册将很简单,只要在Bean配置文件中声明处理器实例,他就会自动注册。


工作原理:
public class LogBeanPostProcessor implements BeanPostProcessor {

	@Override
	public Object postProcessBeforeInitialization(Object bean, String beanName)
			throws BeansException {
		System.out.println(beanName + " say hello world!");
		return bean;
	}

	@Override
	public Object postProcessAfterInitialization(Object bean, String beanName)
			throws BeansException {
		System.out.println(beanName + " say good buy!");
		return bean;
	}

}

<!-- 要在应用上线文中注册一个Bean后处理器,只要在Bean配置文件中声明他的一个实例就可以了。 应用上下文能够自动检测谁实现了BeanPostProcessor接口,并且注册他一处理容器中的所有其他Bean实例 -->
<bean class="com.partner4java.spring.postprocess.LogBeanPostProcessor" />

<bean id="helloResourceLoader" class="com.partner4java.spring.resource.HelloResourceLoader"
	init-method="showResource" />
		
如果以配置文件的格式设置init-method,对BeanPostProcesser的执行没有什么威胁,BeanPostProcesser还是会先执行。
但是如果,以@PreDestroy和@PostConstruct的形式,BeanPostProcesser讲不能正常工作,因为BeanPostProcesser的默认优先级低于CommonAnnotationBeanPostProcesser。
不过可以同时实现PriorityOrdered接口来指定执行顺序。		


12外部化Bean配置

问题:
在配置文件中配置Bean时,你必须记住,讲部署细节如文件路径、服务器地址、用户名和密码与Bean配置混在一起是不好的做法。
通常,Bean配置由应用开发人员编写,而部署细节则是部署人员或者系统管理员的事情。

解决方案:
Spring有一个名为PropertyPlaceholderConfigurer的Bean工厂后处理器,
用来将部分Bean配置外部化为一个属性文件。你可以在Bean配置文件中使用${var}形式的变量,
PropertyPlaceholderConfigurer讲从属性文件中加载属性并且用他们替代变量。

Bea工厂后处理器与Bean后处理器之间的不同在他的目标是IoC容器--Bean工厂或者应用上下文,而不是Bean实例。
Bean工厂后处理器将在IoC容器加载Bean配置之后、Bean实例创建之前生效,他的典型作用是在Bean实例化之前修改Bean配置。
Spring有多个Bean工厂后处理器供你使用。在实战中,你很少与必要编写自己的Bean工厂后处理器。

工作原理:
方式一:
具体指定外部Bean配置类
DBConfig.properties:
DB.name=test

public class DBConfig {
	private String name;

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public String toString() {
		return "DBConfig [name=" + name + "]";
	}
	
}


<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
	<property name="location">
		<value>classpath:DBConfig.properties</value>
	</property>
</bean>

<bean id="dbConfig" class="com.partner4java.spring.config.DBConfig">
	<property name="name" value="${DB.name}"/>
</bean>

第二种:
简单的方式
<context:property-placeholder location="classpath:DBConfig.properties"/>


13解析文本消息

问题:
对于支持国际化的应用来说,为不同地区解析文本消息的能力是必要的。

解决方案:
Spring应用上下文能够按照关键字为目标地区解析文本消息。一般来说,一个地区的消息应该存储在一个独立的属性文件中,这个属性文件称作资源包(Resource bundle)。
MessageSource是定义多种消息解析方法的接口。ApplicationContext接口扩展了这个接口,使用所有应用上下文能够解析文本消息。
应用上下文将消息解析委派给名为messageSource的Bean。ResourceBundleMessageSource最常见的MessageSource实现,他从资源包中解析不同地区的消息。

工作原理:
方式一:
message_en_US.properties:
shopping.wife=gaofumei beatu
shopping.age={0} oh

<bean id="messageSource"
	class="org.springframework.context.support.ResourceBundleMessageSource">
	<property name="basename">
		<value>message</value>
	</property>
</bean>

@Test
public void testAware() throws InterruptedException{
	System.out.println(applicationContext.getMessage("shopping.wife", null, Locale.US));
	System.out.println(applicationContext.getMessage("shopping.age", new Object[]{18}, Locale.US));
}

后台打印:
gaofumei beatu
18 oh


14使用应用事件进行通信

问题:
在组件之间的典型通信模式中,发送者必须定位接受者,以便调用接受者之上的方法。
在这种情况下,发送者组件必须了解接收者组件。这种通信直接而简单,但是发送者和接受者组件紧密耦合。


使用IoC容器时,你的组件可以通过接口而不是实现进行通信。这种通信模式有助于减少耦合。
但是,只有在发送者组件必须与一个接受者通信时有效。当发送者必须与多个接受者通信时,必须逐个调用接收者。


解决方案:
Spring的应用上下文支持基于事件的Bean间通信。
在基于事件的通信模式中,发送者组件只要发布一个事件而不需要知道接收者。
实际上,可以有多于一个接收者组件。
而且,接收者不需要知道是谁发布了事件,可以同时监听不同发送者的多个事件。
这样,发送者和接收者组件是低耦合的。


在Spring中,所有事件类都必须扩展ApplicationEvent类。这样,任何Bean都可以调用应用时间发布者的publishEvent()方法,发布一个事件 。
对于监听某些事件的Bean来说,必须实现ApplicationListener接口,并在onApplicationEvent()方法中处理事件。
实际上,Spring将通知所有事件的监听者,这样你必须自己过滤事件。但是,如果使用类属,Spring将只分发匹配类属参数的消息。


工作原理:
(jdk里面的观察者模式也挺成熟的)


15在Spring中注册属性编辑器

问题:
属性编辑器是JavaBeans API的一项功能,用于属性值与文本值互相转换。
每个属性编辑器仅用于某一类属性。你可以希望采用属性编辑器来简化Bean配置。

解决方案:
Spring IoC容器支持使用属性编辑器帮助Bean配置。
例如,使用java.net.URL类型的属性编辑器,可以指定用于URL类型属性的URL字符串。
Spring会自动的将这个URL字符串转换为一个URL对象,注入你的属性中。
Spring自带多种用于转换常见类型Bean属性的属性编辑器。

一般来说,你应该在Spring IoC容器中注册属性编辑器,然后才能使用它。
CustomEditorConfigurer是作为Bean工厂后处理器来实现的,用于在任何Bean实例化之前注册你的自定义属性编辑器。

工作原理:
就是先写一个编辑器,然后注册,然后自动使用。
除了CustomDateEditor之外,Spring自带多个转换常见数据类型的属性编辑器,
例如CustomNumberEditor、ClassEditor、FileEditor、LocaleEditor、StringArrayPropertyEditor和URLEditor。
可查看包:org.springframework.beans.propertyeditors

public class User {
	private String username;
	private Date birthday;
...

<bean id="dateEditor"
	class="org.springframework.beans.propertyeditors.CustomDateEditor">
	<!-- DateFormat对象作为其第一个构造程序参数 -->
	<constructor-arg>
		<bean class="java.text.SimpleDateFormat">
			<constructor-arg value="yyyy-MM-dd" />
		</bean>
	</constructor-arg>
	<!-- 表示该编辑器是否允许空值 -->
	<constructor-arg value="true"/>
</bean>

<!-- 必须进行注册 -->
<bean class="org.springframework.beans.factory.config.CustomEditorConfigurer">
	<property name="customEditors">
		<map>
			<entry key="java.util.Date">
				<ref local="dateEditor"/>
			</entry>
		</map>
	</property>
</bean>

<bean id="user" class="com.partner4java.spring.editor.User">
	<property name="username" value="gaofumei"/>
	<property name="birthday" value="2012-10-10"/>
</bean>



16创建自定义属性编辑器

问题:
除了注册内建的属性编辑器之外,你可能希望编写自定义的属性编辑器,转换你自定义数据类型。

解决方案:
你可以实现java.beans.PropertyEditor实例或者扩展便利的支持类java.beans.PropertyEditorSupport,编写自定义的属性编辑器。

工作原理:
首先实现自己的编辑器,然后注册编辑器
public class UserEditor extends PropertyEditorSupport {

	@Override
	public String getAsText() {
		DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
		User user = (User) getValue();

		return user.getClass().getName() + "," + user.getUsername() + ","
				+ dateFormat.format(user.getBirthday());
	}

	@Override
	public void setAsText(String text) throws IllegalArgumentException {
		String[] parts = text.split(",");
		DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
		
		try {
			User user = (User)Class.forName(parts[0]).newInstance();
			user.setUsername(parts[1]);
			user.setBirthday(dateFormat.parse(parts[2]));
			
			setValue(user);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

<!-- 必须进行注册 -->
<bean class="org.springframework.beans.factory.config.CustomEditorConfigurer">
	<property name="customEditors">
		<map>
			<entry key="com.partner4java.spring.editor.User">
				<bean class="com.partner4java.spring.editor.UserEditor"/>
			</entry>
		</map>
	</property>
</bean>

<bean id="userChild" class="com.partner4java.spring.editor.UserChild">
	<property name="user">
		<value>com.partner4java.spring.editor.User,gaofumei,2012-01-02</value>
	</property>
</bean>

@Test
public void testAware() throws InterruptedException{
	System.out.println(applicationContext.getBean("userChild"));
}


学Simulink--基于Simulink的无迹卡尔曼滤波(UKF)目标跟踪仿真建模示例 本文详细介绍了基于Simulink的无迹卡尔曼滤波(UKF)目标跟踪仿真建模方法。首先分析了UKF相比EKF在强非线性场景下的优势,包括无线性化误差、计算效率高和鲁棒性强等特点。接着阐述了UKF的核心原理,重点讲解了无迹变换(UT)的三个关键步骤:Sigma点生成、非线性传播和加权统计重构。文章还详细说明了二维机动目标的状态向量定义、非线性状态转移模型和雷达观测模型。 在Simulink实现部分,提供了完整的建模步骤和核心代码,包括目标运动模型、雷达传感器模型和UKF算法模块的实现。通过蛇形机动场景的仿真实 阅读详情

相关推荐

解决windows10下无法安装.net framework 3.5(包括.net2.0和3.0)

入域电脑,win10系统中安装 .net framework 3.5(包括.net2.0和3.0)

God_me_1的博客 4万+

《partner4java 讲述Spring入门》之第一步:Spring概述与Spring IoC

(导读:希望在阅读的过程中,伴随着动手 -- 把讲述的每一步Demo都自己书写一遍,若遇到问题一时解决不了,可发邮件给我:partner4java@163.com;demo下载地址--http://download.youkuaiyun.com/detail/partner4java/4779657;也可以结合视频:http://pan.baidu.com/share/link?shareid=122408&...

爱.NET 354

传感器:MQ-5燃气模块测量燃气值(底部附代码)

本篇文章介绍使用MQ-5燃气模块测量燃气值,CPU还是选择单片机,MQ-5主要使用的技术为ADC,燃气对于单片机来说是模拟信号,需要转换为数字信号,再经过相关计算公式将燃气模拟值转换成对应的燃气数值,便于人们方便查看。例如家庭使用燃气模块测量燃气值,如果燃气值超过一定的范围,可以外设一个报警装置,保证家庭的生命安全。(1)ADC(analog to digital converter)即模数转换器,它可以将模拟信号转换为数字信号。按照其转换原理主要分为逐次逼近型、双积分型、电压频率转换型三种。STM32F1

Mr_zhang1911116的博客 1万+

【Spring】IOC从演变到自动装配的全攻略详解

Spring 框架是一个非常流行的 Java 开发框架,其中的 IOC(Inversion of Control)容器是 Spring 的核心之一。在这篇博客中,我们将深入探讨 IOC 容器的原理和使用方法。通过本文,你将了解到 Spring IOC 容器的工作原理、如何配置和使用 IOC 容器、以及 IOC 容器的优缺点等方面的知识。同时,我们还将通过一些有趣的例子和比喻来帮助你更好地理解 IOC 容器的概念和使用方法。如果你想成为一名优秀的 Java 开发者,那么掌握 Spring IOC 容器的知识是

万维网连五洲,二进制写尽天下事,喜欢结识新伙伴寻找志同道合的朋友,欢迎一起探讨学习 1058

告别同质化!用PyTorch Geometric手把手实现RGCN处理多关系图数据(附实战代码)

本文详细介绍了如何使用PyTorch Geometric实现关系图卷积网络(RGCN)处理多关系图数据,特别适用于社交网络分析、推荐系统等场景。通过实战代码演示了从数据加载、模型构建到训练优化的完整流程,帮助开发者高效处理异构图数据,提升模型性能。

weixin_30781433的博客 259

【Educoder作业】※ 数字图像——绿幕抠像

这次作业比上一篇博客基本得多,大多都是基础函数的运用。没啥说的,就整个sizesizesize即可。 T2 获取一个像素 T3 图像反色 T4 修改透明度 ′RGBA′'RGBA'′RGBA′也是一种图像格式 T5 抠图 T6 添加场景 这个主要是pastepastepaste函数里面的maskmaskmask参量没整明白,转载一篇博客供参考。...

JZYshuraK的博客 7571

找对象攻略 - 必不可少的Spring IOC

具体内容可参见个人网站:http://www.waltersun.cn/documents/java/spring-iocfindbeans.html 找对象攻略 - 必不可少的Spring IOC 什么是IOC 我们常说Java程序员需要对象,⾃⼰new⼀个就⾏了,但实际没那么简单。举个例⼦,如果我找对象,我希望对⽅⻓得好看、⼼地善良,这就产⽣了两个条件: 条件1:⻓得好看 条件2:⼼地善良 什么样的姑娘满⾜这两个条件并且能看上我呢?我不知到,我得去接触,然后了解,最后再确定是不是彼此合拍,这个过程需.

程序员野蛮成长 291

YOLOv13涨点改进 | 全网独家创新、高效涨点改进篇 | CVPR 2024 | YOLOv13引入SHSA单头自注意力模块,减少冗余的多头注意力,轻量化改进,助力目标检测和图像分类任务高效涨点

本文提出了一种改进YOLOv13模型的新方法——SHSA(单头自注意力)模块,用于提升目标检测任务的计算效率和推理速度。SHSA通过简化多头注意力机制为单头结构,显著减少了计算冗余和内存占用。实验表明,该模块在保持精度的同时,在GPU、CPU和移动设备上分别实现了3.3倍、8.1倍和2.4倍的加速效果。文章详细介绍了SHSA的结构原理、核心代码实现方法,以及如何集成到YOLOv13的配置文件中。这种改进特别适合资源受限设备,为实时目标检测提供了更优的速度-精度平衡方案。

Ai缝合怪、助力小伙伴高效发论文 507

《Spring攻略》 第1章 Spring简介 - IoC基础

1实例化SpringIoC容器 问题: 你必须实例化Spring IoC容器,读取配置来创建bean实例。然后,你可以从Spring IoC容器中得到可用的bean实例。 解决方案: Spring提供了两种IoC容器实现类型。基本的一种称为Bean工厂(Bean Factory)。另一种称为应用程序上下文(Application Context),这是对bean工厂的一种兼容扩

java相关技术(partner4java专栏)希望对您的学习有所帮助 1977

【重要内容】敬告读者

由于优快云近期将要搞事情,此专栏建议已购买的用户将内容保存到本地。尚未购买的用户请待9月1日后再决定是否需要购买。如此规则上线,本人将会关闭此专栏。并寻找其他渠道进行发布。

魔落的博客 910

具身智能(40):主流 VLA 模型π₀

摘要: π₀是首款专为机器人设计的VLA(视觉-语言-动作)端到端基础模型,通过双阶段训练实现“感知-决策-执行”闭环。其创新点包括:1)FlowMatching技术实现连续平滑动作控制(精度0.3°);2)结合VLM预训练与多机器人实操数据,零样本任务完成率达76.4%,远超同类模型;3)支持模糊指令理解与动态场景适应(如遮挡识别)。开源版本涵盖不同规模模型,适用于工业装配、服务机器人等场景,在延迟(213ms)和稳定性(92%自主恢复率)上显著领先OpenVLA等竞品。

码农17年的博客 510

《Spring攻略(第2版)》——第1章 Spring简介 1.1实例化Spring IoC容器

本节书摘来自异步社区《Spring攻略(第2版)》一书中的第1章,第1.1节,作者: 【美】Gary Mak , Josh Long , Daniel Rubio著,更多章节内容可以访问云栖社区“异步社区”公众号查看 第1章 Spring简介 在本章中,你将参加关于Spring、核心容器以及容器所提供的一些全局可用设施的一个速成班(或者一次复习),你还将...

weixin_33881041的博客 92

cesium 淹没分析

cesium淹没分析

God's asylum的博客 481

Spring 学习笔记2—— IoC容器

必须实例化SpringIoC容器,读取其配置来创建bean实例,然后从Spring IoC容器中得到可用的bean实例。Spring提供两种IoC容器实现类型。 Bean factory Application contet 应用程序上下文提供比Bean工厂更高级的特性,两种类型配置文件相同。 Bean工厂接口是:BeanFactory 应用程序上下文接口:ApplicationContextA

猿来这样-谢厂节的博客 824

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

spring文档阅读——Core: The IoC Container

用了这么久的spring框架却一直不知其所以然,直接在网上看别人的攻略又感觉差了点什么,因此决定系统的看一下spring官方的英文文档。本系列博客将按照每一篇文章对应官方文档中的一个小节的形式发布,文章内容分为正文和单词两部分。 笔者的英文水平一般,正文中的引用翻译也只是部分翻译,故本文只是spring文档阅读过程中的记录和分享,不可作为译文参考。 官方文档地址:https://spring.io/projects/spring-framework

ary的博客 834

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

《Spring攻略(第2版)》——1.2 配置Spring IoC容器中的Bean

本节书摘来自异步社区《Spring攻略(第2版)》一书中的第1章,第1.2节,作者: 【美】Gary Mak , Josh Long , Daniel Rubio著,更多章节内容可以访问云栖社区“异步社区”公众号查看 1.2 配置Spring IoC容器中的Bean 1.2.1 问题Spring提供了一个强大的IoC容器来管理组成应用的bean。为了利用...

weixin_33887443的博客 87

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Spring框架完全攻略:Java-Notes中的IoC与AOP实战教程

Spring框架是Java开发领域中最流行的企业级应用开发框架之一,它以IoC(控制反转)和AOP(面向切面编程)为核心,为开发者提供了一站式的企业级应用解决方案。本教程将结合Java-Notes项目中的框架笔记,带您深入理解Spring框架的核心概念与实战应用。 ## 一、Spring框架总览:企业级开发的基石 Spring框架采用分层架构设计,提供了从基础的Bean管理到复杂的企业级服务(

gitblog_00127的博客 1081

实例化Spring IoC容器

Spring提供两种IoC容器实现类型: Bean工厂(Beanfactory),对应的接口是BeanFactory。应用程序上下文(Applicationcontext),对应的借口是ApplicationContext,推荐使用。 ApplicationContext接口对应的实现类有: ClassPathXmlApplicationContext:实现从clas

殷建卫 713

​Spring面试全攻略:从IoC到微服务,万字深度解析(含图解)​

自2004年发布以来,Spring Framework已经从一个轻量级的依赖注入容器,发展成为一套庞大的、涵盖企业应用开发方方面面的生态系统。它通过控制反转(IoC)​、面向切面编程(AOP)​​ 等核心理念,极大地简化了Java企业级开发的复杂性。

一起探索IT的世界 1232

【慕课网Spring系列学习攻略】IOC及Bean容器篇

从慕课网的java工程师路径一路学上来,感觉很顺利,但鉴于Spring系列对新手不太友好,写点我的理解希望对新手有点帮助! 慕课网地址:http://www.imooc.com/learn/196 1、搭建环境     由于老师用的环境比较复杂,我们暂时不需要那么复杂的环境,可以先搭建一个简单点的!注重对知识的学习即可: 在eclipse中新建web工程: 填入项

逐鹿 944

Spring面试高频题解析:从IoC到AOP的完整攻略

控制反转(IoC)和面向切面编程(AOP)是Spring框架的两大核心技术。IoC通过依赖注入(DI)实现组件解耦,其核心容器采用三级缓存机制解决循环依赖问题。AOP则基于动态代理实现,支持JDK动态代理和CGLIB两种方式,用于日志记录、事务管理等横切关注点。在Java后端开发中,Spring的事务管理尤为重要,涉及7种传播行为和4种隔离级别。理解这些核心机制不仅能应对90%的Spring面试问题,更能帮助开发者构建高可维护性的企业级应用。本文特别针对循环依赖和动态代理等高频考点进行深度解析,并给出实际工

weixin_34021089的博客 466

【Spring 核心: IoC&DI】从原理到注解使用、注入方式全攻略

这篇文章搭建了 Spring 核心内容 :IoC/DI 的知识框架,先明确概念与 IoC 的优势;再讲 IoC 的 Bean 管理实操,涵盖存储、定义、扫描路径;最后讲 DI 的三种注入实操方式,对比各方式的适用场景,同时说明注入异常的解决办法。

独断万古他化的博客 1万+

Spring框架面试全攻略:从IOC/AOP到微服务与AI集成

控制反转(IOC)和面向切面编程(AOP)是Spring框架实现松耦合和模块化设计的核心原理。IOC容器通过依赖注入管理对象生命周期,AOP则通过动态代理技术实现横切关注点的统一处理,这两大机制共同构成了Spring生态的技术基石。在微服务架构和AI技术兴起的背景下,Spring Boot通过自动装配简化了配置,Spring Cloud提供了服务治理的完整解决方案,而新兴的Spring AI项目则让开发者能够便捷地集成大语言模型和向量数据库。本文围绕Spring面试高频考点,系统梳理了从核心原理到微服务、A

weixin_29306317的博客 245

Spring攻略学习笔记(1)------实例化Spring IoC容器

1、知识点 Spring提供两种IoC容器实现类型。基本的一种为Bean Factory(Bean工厂)。更高级的一种为Application Context(应用程序上下文),它是对Bean工厂的兼容和扩展。 两种IoC容器类型的Bean配置文件相同。 应用程序上下文提供比Bean工厂更高级的特性,同时保持基本特性的兼容。...

weixin_30609331的博客 75

《Spring攻略(第2版)》——导读

** 前言 **Spring框架正在成长。它始终与选择相关。Java EE关注于少数几项技术,很大程度上阻碍了更好的替代解决方案出现。当Spring框架出现时,没有多少人还会承认Java EE是当今最佳的架构。随后Spring被大张旗鼓地推出,因为它寻求简化Java EE。此后其每个版本都引入设计用来简化和实现解决方案的新特性。 从2.0版本之...

weixin_34107955的博客 232
上一篇: 《Spring攻略》 第1章 Spring简介 - IoC基础
下一篇: 《Spring攻略》第3章 Spring AOP和AspectJ支持
partner4java
博客等级 码龄17年 481粉丝 183原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值