1.@Bean,名称默认为方法名
2.包扫描+组件标注注解(@Controller/@Service/@Repository/@Component)
3.@Import
4.利用Spring提供的FactoryBean
创建项目引入jar包
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.1.2.RELEASE</version>
</dependency>
对spring-context的解释
Spring通过应用上下文(Application Context)装载bean的定义并把它们组装起来。Spring应用上下文全权负责对象的创建和组装。Spring自带了多种应用上下文的实现,它们之间主要的区别仅仅在于如何加载配置。
1.AnnotationConfigApplicationContext:从一个或多个基于Java的配置类中加载 Spring应用上下文。
2.AnnotationConfigWebApplicationContext:从一个或多个基于Java的配置类中 加载Spring Web应用上下文。
3.ClassPathXmlApplicationContext:从类路径下的一个或多个XML配置文件中加 载上下文定义,把应用上下文的定义文件作为类资源。
4.FileSystemXmlapplicationcontext:从文件系统下的一个或多个XML配置文件 中加载上下文定义。
5.XmlWebApplicationContext:从Web应用下的一个或多个XML配置文件中加载上下 文定义。
@Bean
@Configuration//配置类=配置文件 告诉spring这个是个配置类
public class Config {
@Bean(name="wangshuangPerson") //给容器注入一个组件,相当于bean.xml中的bean标签,class为返回值类型,id为方法名
@Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON)//默认单例模式:容器创建的时候创建对象。多例模式:调用一次创建一次对象
@Lazy //bean的加载时机:单例模式:容器创建的时候创建对象。多例模式:调用一次创建一次对象。当@Lazy(true)时不管什么模式都调用的时候才加载,单例模式和多例模式的区别是单例模式只创建一次对象,多例模式调用几次创建几个对象
public Person getPerson() {
System.out.println("创建Person");
return new Person("wangshaung", "10");
}
}
测试类
public class AnnotationTest {
public static void main(String[] args) {
//创建容器
AnnotationConfigApplicationContext acac=new AnnotationConfigApplicationContext(Config.class);
//返回此工厂中定义的所有bean的名称。
String[] beanDefinitionNames = acac.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {
System.out.println(beanDefinitionName);
}
}
}
输出结果
包扫描+组件标注注解(@Controller/@Service/@Repository/@Component)
@Configuration//配置类=配置文件 告诉spring这个是个配置类
@ComponentScan(value = {
"com.wangshua