在Spring的IOC容器里配置Bean
配置Bean形式:基于xml文件方式、基于注解的方式
在xml文件中通过bean节点配置bean:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean name="helloSpring" class="com.dx.spring.beans.HelloSpring">
<property name="name" value="Spring"></property>
</bean> </beans>
参考:《Spring(二):Spring框架&Hello Spring》中配置过程
id:Bean的名称
1)在IOC容器中必须是唯一的;
2)若id没有指定,Spring会自动将全系nag定型为类名作为Bean的名字;
3)id可以指定多个名字,名字之间可用逗号、分号、或空格分隔。
Bean的配置方式:
1)通过全类名(反射实现,此时要求该bean类拥有一个无参数构造器)、
2)通过工厂方法(静态工厂方法&实例工厂方法,参考:《Spring(十三):使用工厂方法来配置Bean的两种方式(静态工厂方法&实例工厂方法)》)、
3)FactoryBean(参考:《Spring(十四):使用FactoryBean配置Bean》)
4)@Configuration注解的配置类中注册bean,具体如下:
package test; public class User {
private Integer id;
private String name;
。。。
} // 定义配置Bean配置类
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; @Configuration
public class ApplicationConfigBean {
@Bean
public User getUser() {
return new User();
}
} // 测试类
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext; public class App {
public static void main(String[] args) {
ApplicationContext ctx = new AnnotationConfigApplicationContext(ApplicationConfigBean.class);
System.out.println(ctx.getBean(User.class));
}
}
IOC容器BeanFactory&ApplicationContext概述
Spring容器
1)在Spring IOC容器读取Bean配置创建Bean实例之前,必须对它进行实例化。只有在容器实例化后,才可以从IOC容器里获取Bean实例并使用。
2)Spring提供了两种类型IOC容器实现
---BeanFactory:IOC容器的基本实现。BeanFactory是Spring框架的基础设施,面向Spring本身。
---ApplicationContext:提供了更多的高级属性,是BeanFactory的子接口。ApplicationContext面向使用Spring框架的开发者,几乎所有的应用场合都直接使用ApplicationContext,而非底层的BeanFactory。
备注:
1)无论使用两种方式的哪一种,配置文件是相同的。
2)如何却别ApplicatinContext是BeanFactory的子接口:
ApplicatinContext的类定义:
// Compiled from ApplicationContext.java (version 1.8 : 52.0, no super bit)
public abstract interface org.springframework.context.ApplicationContext
extends org.springframework.core.env.EnvironmentCapable,
org.springframework.beans.factory.ListableBeanFactory,
org.springframework.beans.factory.HierarchicalBeanFactory,
org.springframework.context.MessageSource,
org.springframework.context.ApplicationEventPublisher,
org.springframework.core.io.support.ResourcePatternResolver { // Method descriptor #10 ()Ljava/lang/String;
@org.springframework.lang.Nullable
public abstract java.lang.String getId(); // Method descriptor #10 ()Ljava/lang/String;
public abstract java.lang.String getApplicationName(); // Method descriptor #10 ()Ljava/lang/String;
public abstract java.lang.String getDisplayName(); // Method descriptor #16 ()J
public abstract long getStartupDate(); // Method descriptor #18 ()Lorg/springframework/context/ApplicationContext;
@org.springframework.lang.Nullable
public abstract org.springframework.context.ApplicationContext getParent(); // Method descriptor #20 ()Lorg/springframework/beans/factory/config/AutowireCapableBeanFactory;
public abstract org.springframework.beans.factory.config.AutowireCapableBeanFactory getAutowireCapableBeanFactory() throws java.lang.IllegalStateException;
}
从上边我们知道ApplicationContext是继承了org.springframework.beans.factory.ListableBeanFactory,org.springframework.beans.factory.HierarchicalBeanFactory接口,而这两个接口都是继承了org.springframework.beans.factory.BeanFactory接口。
public interface BeanFactory {
String FACTORY_BEAN_PREFIX = "&";
Object getBean(String name) throws BeansException;
<T> T getBean(String name, @Nullable Class<T> requiredType) throws BeansException;
Object getBean(String name, Object... args) throws BeansException;
<T> T getBean(Class<T> requiredType) throws BeansException;
<T> T getBean(Class<T> requiredType, Object... args) throws BeansException;
boolean containsBean(String name);
boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;
boolean isTypeMatch(String name, @Nullable Class<?> typeToMatch) throws NoSuchBeanDefinitionException;
@Nullable
Class<?> getType(String name) throws NoSuchBeanDefinitionException;
String[] getAliases(String name); }
因此,说ApplicationContext是BeanFactory的子接口类。
ApplicaionContext
ApplicationContext的主要实现类:
---ClassPathXmlApplicationContext:从类路径下加载配置文件
---FileSystemXmlApplicationContext:从文件系统中加载配置文件。
ConfigurableApplicationContext扩展与ApplicationContext,新增加两个主要的方法:refresh()和close(),让ApplicationContext具有启动、刷新和关闭上下文的能力。
// Compiled from ConfigurableApplicationContext.java (version 1.8 : 52.0, no super bit)
public abstract interface org.springframework.context.ConfigurableApplicationContext extends org.springframework.context.ApplicationContext, org.springframework.context.Lifecycle, java.io.Closeable { // Field descriptor #8 Ljava/lang/String;
public static final java.lang.String CONFIG_LOCATION_DELIMITERS = ",; \t\n"; // Field descriptor #8 Ljava/lang/String;
public static final java.lang.String CONVERSION_SERVICE_BEAN_NAME = "conversionService"; // Field descriptor #8 Ljava/lang/String;
public static final java.lang.String LOAD_TIME_WEAVER_BEAN_NAME = "loadTimeWeaver"; // Field descriptor #8 Ljava/lang/String;
public static final java.lang.String ENVIRONMENT_BEAN_NAME = "environment"; // Field descriptor #8 Ljava/lang/String;
public static final java.lang.String SYSTEM_PROPERTIES_BEAN_NAME = "systemProperties"; // Field descriptor #8 Ljava/lang/String;
public static final java.lang.String SYSTEM_ENVIRONMENT_BEAN_NAME = "systemEnvironment"; // Method descriptor #22 (Ljava/lang/String;)V
public abstract void setId(java.lang.String arg0); // Method descriptor #24 (Lorg/springframework/context/ApplicationContext;)V
public abstract void setParent(@org.springframework.lang.Nullable org.springframework.context.ApplicationContext arg0); // Method descriptor #28 (Lorg/springframework/core/env/ConfigurableEnvironment;)V
public abstract void setEnvironment(org.springframework.core.env.ConfigurableEnvironment arg0); // Method descriptor #30 ()Lorg/springframework/core/env/ConfigurableEnvironment;
public abstract org.springframework.core.env.ConfigurableEnvironment getEnvironment(); // Method descriptor #32 (Lorg/springframework/beans/factory/config/BeanFactoryPostProcessor;)V
public abstract void addBeanFactoryPostProcessor(org.springframework.beans.factory.config.BeanFactoryPostProcessor arg0); // Method descriptor #34 (Lorg/springframework/context/ApplicationListener;)V
// Signature: (Lorg/springframework/context/ApplicationListener<*>;)V
public abstract void addApplicationListener(org.springframework.context.ApplicationListener arg0); // Method descriptor #38 (Lorg/springframework/core/io/ProtocolResolver;)V
public abstract void addProtocolResolver(org.springframework.core.io.ProtocolResolver arg0); // Method descriptor #40 ()V
public abstract void refresh() throws org.springframework.beans.BeansException, java.lang.IllegalStateException; // Method descriptor #40 ()V
public abstract void registerShutdownHook(); // Method descriptor #40 ()V
public abstract void close(); // Method descriptor #47 ()Z
public abstract boolean isActive(); // Method descriptor #49 ()Lorg/springframework/beans/factory/config/ConfigurableListableBeanFactory;
public abstract org.springframework.beans.factory.config.ConfigurableListableBeanFactory getBeanFactory() throws java.lang.IllegalStateException; // Method descriptor #50 ()Lorg/springframework/core/env/Environment;
// Stack: 1, Locals: 1
public bridge synthetic org.springframework.core.env.Environment getEnvironment();
0 aload_0 [this]
1 invokeinterface org.springframework.context.ConfigurableApplicationContext.getEnvironment() : org.springframework.core.env.ConfigurableEnvironment [1] [nargs: 1]
6 areturn
Line numbers:
[pc: 0, line: 43]
Local variable table:
[pc: 0, pc: 7] local: this index: 0 type: org.springframework.context.ConfigurableApplicationContext
}
ApplicationContext在初始化上下文时就实例化所有单例的Bean。
WebApplicationContext是专门为WEB应用而准备的,它允许从相对于WEB根目录的路径中完成初始化工作。
依赖注入的方式:
1)属性注入(set方法注入);
package com.dx.spring.beans; public class HelloSpring {
private String name; public HelloSpring() { } public void setName(String name) {
this.name = name;
} public void sayHello() {
System.out.println("Hello " + this.name);
}
}
setName方法注入:
<bean name="helloSpring" class="com.dx.spring.beans.HelloSpring">
<property name="name" value="Spring"></property>
</bean>
2)构造函数注入;
a)通过构造方法注入Bean的属性值或依赖的对象,它保证了Bean实例在实例化后就可以使用。
b)构造器注入在<constructor-arg>元素里声明属性,<constructor-arg>中没有name属性。
<bean name="car" class="com.dx.spring.beans.Car">
<constructor-arg value="AUDI" index="0"></constructor-arg>
<constructor-arg value="Shanghai" index="1"></constructor-arg>
<constructor-arg value="400000" type="double"></constructor-arg>
</bean>
<bean name="car2" class="com.dx.spring.beans.Car">
<constructor-arg value="BMW" type="java.lang.String"></constructor-arg>
<constructor-arg value="Shanghai" type="java.lang.String"></constructor-arg>
<constructor-arg value="260" type="int"></constructor-arg>
</bean>
Car.java
package com.dx.spring.beans; public class Car {
private String brand;
private String corp;
private double price;
private int maxSpeed; public Car(String brand, String corp, double price) {
super();
this.brand = brand;
this.corp = corp;
this.price = price;
} public Car(String brand, String corp, int maxSpeed) {
super();
this.brand = brand;
this.corp = corp;
this.maxSpeed = maxSpeed;
} @Override
public String toString() {
return "Car [brand=" + brand + ", corp=" + corp + ", price=" + price + ", maxSpeed=" + maxSpeed + "]";
} }
client.java
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
HelloSpring helloSpring = (HelloSpring) applicationContext.getBean("helloSpring"); Car car = (Car) applicationContext.getBean("car"); Car car2 = (Car) applicationContext.getBean("car2"); System.out.println(car);
System.out.println(car2);
}
输出信息:
Car [brand=AUDI, corp=Shanghai, price=400000.0, maxSpeed=0]
Car [brand=BMW, corp=Shanghai, price=0.0, maxSpeed=260]
3)工厂方法注入
不推荐、也不常用
注入属性值细节
1)字面值
字面值:可用字符串表示的值,可以通过<value>元素标签或value属性进行注入。
基本数据类型及封装类、String等类型都可以采用字面值注入的方式
若字面值中包含特殊字符,可以使用<![CDATA[]]>把字面值包裹起来。
Person.java
package com.dx.spring.beans; public class Person {
private String name;
private String age;
private Car car; public Person(String name, String age, Car car) {
super();
this.name = name;
this.age = age;
this.car = car;
} public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public Car getCar() {
return car;
}
public void setCar(Car car) {
this.car = car;
} @Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", car=" + car + "]";
} }
<bean name="car2" class="com.dx.spring.beans.Car">
<constructor-arg value="BMW" type="java.lang.String"></constructor-arg>
<constructor-arg type="java.lang.String">
<value><![CDATA[<Shanghai>]]></value>
</constructor-arg>
<constructor-arg type="int">
<value>260</value>
</constructor-arg>
</bean>
2)引用其它Bean
组成应用程序的Bean机场需要相互协作已完成应用程序的功能,需要使用Bean能够相互访问,就必须在Bean配置文件中指定对Bean的引用
在Bean的配置文件中,可以通过<ref>元素或者ref属性为bean的属性或,构造器参数指定对bean的引用。
也可以在属性或构造器里包含Bean的声明,这样的Bean成为内部Bean。
3)注入参数详解:null值和级联属性
可以使用专用的<null/>元素标签为bean的字符串或其它对象类型的属性注入null值。
<bean id="person3" class="com.dx.spring.beans.Person">
<constructor-arg value="Lisi"></constructor-arg>
<constructor-arg value="25"></constructor-arg>
<constructor-arg name="car">
<null/>
</constructor-arg>
</bean>
和struts、hibernate等框架一样,spring支持级联属性的配置。
<bean id="person" class="com.dx.spring.beans.Person">
<constructor-arg value="Zhangsan"></constructor-arg>
<constructor-arg value="24"></constructor-arg>
<constructor-arg ref="car"></constructor-arg>
<property name="car.maxSpeed" value="260"></property>
</bean>
注意:
1)上边代码必须要要求先初始化car,否则直接给car.maxSpeed赋值会抛出异常与struts2不同点。
2)需要在car中实现setMaxSpeed方法。
public void setMaxSpeed(int maxSpeed) {
this.maxSpeed = maxSpeed;
}
4)集合属性
在Spring中可以通过一组内置的xml标签(例如:<list>,<set>,<map>)来配置集合属性。
4.1)配置java.util.List类型的属性,需要指定<list>标签,在标签里包含一些元素。这些标签可以通过<value>指定简单的常量值,通过<ref>指定对其它Bean的引用,通过<bean>指定内置bean定义。通过<null/>指定空元素。甚至可以内嵌其他集合。
applicationContext.xml
<bean name="car" class="com.dx.spring.beans.Car">
<constructor-arg value="AUDI" index="0"></constructor-arg>
<constructor-arg value="Shanghai" index="1"></constructor-arg>
<constructor-arg value="400000" type="double"></constructor-arg>
</bean>
<bean name="car2" class="com.dx.spring.beans.Car">
<constructor-arg value="BMW" type="java.lang.String"></constructor-arg>
<constructor-arg type="java.lang.String">
<value><![CDATA[<Shanghai>]]></value>
</constructor-arg>
<constructor-arg type="int">
<value>260</value>
</constructor-arg>
</bean>
<bean id="person4" class="com.dx.spring.beans.collections.Person">
<property name="name" value="Nike"></property>
<property name="age" value="25"></property>
<property name="cars">
<list>
<ref bean="car" />
<ref bean="car2" />
</list>
</property>
</bean>
client.java
public static void main(String[] args) {
ApplicationContext cxt = new ClassPathXmlApplicationContext("applicationContext.xml");
Person person = (Person) cxt.getBean("person4"); System.out.println(person);
}
Person.java
package com.dx.spring.beans.collections; import java.util.List; import com.dx.spring.beans.Car; public class Person {
private String name;
private int age;
private List<Car> cars; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public List<Car> getCars() {
return cars;
} public void setCars(List<Car> cars) {
this.cars = cars;
} @Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", cars=" + cars + "]";
} }
打印结果:
Person [name=Nike, age=25, cars=[Car [brand=AUDI, corp=Shanghai, price=400000.0, maxSpeed=260], Car [brand=BMW, corp=<Shanghai>, price=0.0, maxSpeed=260]]]
4.2)数组的定义和List一样,都可以使用<list>
修改Person.java为:
public Car[] getCars() {
return cars;
} public void setCars(Car[] cars) {
this.cars = cars;
} @Override
public String toString() {
String carsStr = "";
for (Car car : cars)
carsStr += car.toString() + ",";
return "Person [name=" + name + ", age=" + age + ", cars=[" + carsStr + "]]";
}
applicationContext.xml不变,client.java也不变,打印结果:
Person [name=Nike, age=25, cars=[Car [brand=AUDI, corp=Shanghai, price=400000.0, maxSpeed=260],Car [brand=BMW, corp=<Shanghai>, price=0.0, maxSpeed=260],]]
4.3)配置java.util.Set需要使用<set>标签,定义元素的方法与List一样。
修改Person.car属性类型:
private Set<Car> cars; public Set<Car> getCars() {
return cars;
} public void setCars(Set<Car> cars) {
this.cars = cars;
} @Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", cars=" + cars+ "]";
}
修改applicationContext.xml
<bean id="person4" class="com.dx.spring.beans.collections.Person">
<property name="name" value="Nike"></property>
<property name="age" value="25"></property>
<property name="cars">
<set>
<ref bean="car" />
<ref bean="car2" />
</set>
</property>
</bean>
client.java不变,打印结果:
Person [name=Nike, age=25, cars=[Car [brand=AUDI, corp=Shanghai, price=400000.0, maxSpeed=260], Car [brand=BMW, corp=<Shanghai>, price=0.0, maxSpeed=260]]]
4.4)java.util.Map通过<map>标签定义,<map>标签里可以使用多个<entry>作为子标签,每个条目包含一个键和一个值。
4.4.1)map必须在<key>标签里定义键。
4.4.2)因为键和值的类型没有限制,所以可以*地为它们指定<value>,<ref>,<bean>或<null>元素。
4.4.3)可以将Map的键和值作为<entry>的属性定义:简单常量可以使用key和value来定义;Bean引用通过key-ref和value-ref属性定义。
修改Person.car属性类型:
private Map<String,Car> cars; public Map<String,Car> getCars() {
return cars;
} public void setCars(Map<String,Car> cars) {
this.cars = cars;
}
修改applicationContext.xml
<bean id="person4" class="com.dx.spring.beans.collections.Person">
<property name="name" value="Nike"></property>
<property name="age" value="25"></property>
<property name="cars">
<map>
<entry key="car1" value-ref="car"></entry>
<entry key="car2" value-ref="car2"></entry>
</map>
</property>
</bean>
client.java不变,打印结果为:
Person [name=Nike, age=25, cars={car1=Car [brand=AUDI, corp=Shanghai, price=400000.0, maxSpeed=260], car2=Car [brand=BMW, corp=<Shanghai>, price=0.0, maxSpeed=260]}]
5)使用<props>定义java.util.Properties,该标签使用多个<prop>作为子标签,每个<prop>标签必须定义key属性。
定义DataSource.java
package com.dx.spring.beans.collections; import java.util.Properties; public class DataSource {
private Properties properties; public Properties getProperties() {
return properties;
} public void setProperties(Properties properties) {
this.properties = properties;
} @Override
public String toString() {
return "DataSource [properties=" + properties + "]";
}
}
applicationContext.xml配置:
<bean id="proerpties_test" class="com.dx.spring.beans.collections.DataSource">
<property name="properties">
<props>
<prop key="username">username</prop>
<prop key="password">password</prop>
<prop key="jdbcUri">jdbc:mysql:3306///test</prop>
<prop key="driverClass">com.mysql.jdbc.Driver</prop>
</props>
</property>
</bean>
client.java
public static void main(String[] args) {
ApplicationContext cxt = new ClassPathXmlApplicationContext("applicationContext.xml");
DataSource dataSource=(DataSource)cxt.getBean("proerpties_test");
System.out.println(dataSource);
}
打印结果:
DataSource [properties={jdbcUri=jdbc:mysql:3306///test, driverClass=com.mysql.jdbc.Driver, password=password, username=username}]
5)使用utility schema 定义集合
5.1)之前使用基本的集合标签定义集合是,不能将集合作为独立的Bean定义,导致其他Bean无法引用该集合,所以无法在不同的Bean之间共享集合。
5.2)可以使用util schema 里的集合标签定义独立的集合Bean。需要注意的是,必须在<beans>根元素里添加util schema定义。
举例:
Person.java
package com.dx.spring.beans.collections; import java.util.List; import com.dx.spring.beans.Car; public class Person {
private String name;
private int age;
public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} private List<Car> cars; public List<Car> getCars() {
return cars;
} public void setCars(List<Car> cars) {
this.cars = cars;
} @Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", cars=" + cars+ "]";
} }
applicationContext.xml
<?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:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.3.xsd"> <bean id="person4" class="com.dx.spring.beans.collections.Person">
<property name="name" value="Nike"></property>
<property name="age" value="25"></property>
<property name="cars" ref="cars"></property>
</bean> <util:list id="cars">
<ref bean="car"></ref>
<ref bean="car2"></ref>
<bean name="car3" class="com.dx.spring.beans.Car">
<constructor-arg value="Ford" index="0"></constructor-arg>
<constructor-arg value="Changan" index="1"></constructor-arg>
<constructor-arg value="140000" type="double"></constructor-arg>
</bean>
</util:list>
</beans>
测试client.java
public static void main(String[] args) {
ApplicationContext cxt = new ClassPathXmlApplicationContext("applicationContext.xml");
Person person = (Person) cxt.getBean("person4");
System.out.println(person);
}
打印结果:
Person [
name=Nike,
age=25,
cars=
[
Car [brand=AUDI, corp=Shanghai, price=400000.0, maxSpeed=260],
Car [brand=BMW, corp=<Shanghai>, price=0.0, maxSpeed=260],
Car [brand=Ford, corp=Changan, price=140000.0, maxSpeed=0]
]
]
6)使用p命名空间
6.1)为了简化xml文件的配置,原来越多的xml文件采用属性而非子元素配置信息。
6.2)Spring从2.5版本开始引入了一个新的p命名空间,可以通过<bean>元素属性的方式配置bean的属性。
6.3)使用p命名空间后,基于xml的配置方式将进一步简化。
<bean id="person4" class="com.dx.spring.beans.collections.Person" p:name="Nike" p:age="25" p:cars-ref="cars">
<!--
<property name="name" value="Nike"></property>
<property name="age" value="25"></property>
<property name="cars" ref="cars"></property>
-->
</bean> <util:list id="cars">
<ref bean="car"></ref>
<ref bean="car2"></ref>
<bean name="car3" class="com.dx.spring.beans.Car">
<constructor-arg value="Ford" index="0"></constructor-arg>
<constructor-arg value="Changan" index="1"></constructor-arg>
<constructor-arg value="140000" type="double"></constructor-arg>
</bean>
</util:list>
Spring(八):Spring配置Bean(一)BeanFactory&ApplicationContext概述、依赖注入的方式、注入属性值细节的更多相关文章
-
Spring入门第一课:Spring基础与配置Bean
1.入门 Spring是简化java开发的一个框架,其中IoC和AOP是Spring的两个重要核心.由于Spring是非侵入性的,通过Ioc容器来管理bean的生命周期,还整合了许多其他的优秀框架,所 ...
-
Spring下如何配置bean
本次讲述项目背景: 创建Service类,Service下用到dao类.通过在Spring中配置bean,实现在项目启动时,自动加载这个类 本次只讲述配置bean的注意事项,故只给出简单实例: 创建S ...
-
[原创]java WEB学习笔记99:Spring学习---Spring Bean配置:自动装配,配置bean之间的关系(继承/依赖),bean的作用域(singleton,prototype,web环境作用域),使用外部属性文件
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
-
5. Spring 通过 XML 配置 bean (进阶)
1. 设置 bean 的作用域 当通过 Spring IOC 容器创建 bean 实例的时候,不仅可以完成 bean 的实例化,也可以为 bean 指定特定的作用域,Spring 支持以下 5 种作用 ...
-
12.Spring通过FactoryBean配置Bean
为啥要使用FactoryBean: 在配置Bean的时候,需要用到IOC容器中的其它Bean,这个时候使用FactoryBean配置最合适. public class Car { private St ...
-
Spring 通过工厂配置Bean
1.通过静态工厂方法配置Bean 要声明通过静态方法创建的 Bean, 需要在 Bean 的 class 属性里指定拥有该工厂的方法的类, 同时在 factory-method 属性里指定工厂方法的名 ...
-
spring学习笔记二:spring使用构造方法注入(set方式注入)
项目目录树: 1.spring的依赖包配置 * SPRING_HOME/dist/spring.jar * SPRING_HOME/lib/log4j/log4j-1.2.14.jar * SPRIN ...
-
学习 Spring (八) 注解之 Bean 的定义及作用域
Spring入门篇 学习笔记 Classpath 扫描与组件管理 从 Spring 3.0 开始,Spring JavaConfig 项目提供了很多特性,包括使用 java 而不是 XML 定义 be ...
-
Spring通过注解配置Bean
@Component: 基本注解, 标识了一个受 Spring 管理的组件@Repository: 标识持久层组件@Service: 标识服务层(业务层)组件@Controller: 标识表现层组件 ...
随机推荐
-
为了防止采集,把文章中出现的URL链接随机大小写(PHP实现)
<?php $string = "http://www.kxblogs.com/n/20161115/74439155.html"; $string = explode('/ ...
-
(转)innerHTML、innerText和outerHTML、outerText的区别
原文:http://walsh.iteye.com/blog/261966 innerHTML.innerText和outerHTML.outerText的区别 博客分类: CSS/ ...
-
linux内核设计与实现--进程管理
进程就是出于执行期的程序.进程的另一个名字是任务. 执行线程,简称线程(thread),是在进程中活动的对象.每个线程都有一个独立的程序计数器.进程栈和一组进程寄存器.内核调度的对象是线程,而不是进程 ...
-
QT---线程间通信(要先编译libqt-mt.so?)
在 Qt 系统中,运行着一个GUI 主事件线程,这个主线程从窗口系统中获取事件,并将它们分发到各个组件去处理.在 QThread 类中有一种从非主事件线程中将事件提交给一个对象的方法,也就是 QThr ...
-
二十六、Jcreator使用初步
摘自http://blog.csdn.net/liujun13579/article/details/7751464 二十六.Jcreator使用初步 Jcreator是一个小巧灵活的Java开发工具 ...
-
WPF子界面向父界面传递带参数的委托
需求如下: 父界面上有几个按钮,需要在点击按钮的时候向父界面传值,以知道该控制哪个界面显示. 父界面:WIN1 子界面:WIN2 此处或者说是子控件向父控件传值 1.子界面定义委托 WIN2里写: p ...
-
MTCNN算法与代码理解—人脸检测和人脸对齐联合学习
目录 写在前面 算法Pipeline详解 如何训练 损失函数 训练数据准备 多任务学习与在线困难样本挖掘 预测过程 参考 博客:blog.shinelee.me | 博客园 | CSDN 写在前面 主 ...
-
MegaCLi命令总结
MegaCli命令总结 MegaCli 版本8.00.29,raid卡为lsi 8888elp,固件11.0.1-0036 1 巡读 一MegaCli -adppr -enblauto -a0 ...
-
javascript Location对象属性和方法
Location对象 Location对象包含有关当前URL的信息 https://blog.csdn.net/u010953692/article/details/80901035#3 https( ...
-
学习模型-视图-控制器MVC模式
1.MVC简介 MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数据.界面显示分 ...