1 使用XML文件配置Spring程序
在XML文件中使用bean标签,将其交给容器管理
- class: 指定bean对应的类型的全限定名称
- id: 用于指定一个名称,作为该bean的唯一标识符,如果不需要id,也可不指定该属性
- name: 用于指定bean的别名,多个的使用空格或逗号或分号分割
- scope: 指定bean的范围,决定了bean实例化的数量
scope有效值:
singleton: 默认值,单例,每次请求一个bean,返回的是同一个共享实例
prototype: 原型,每次请求一个bean,获取的是一个新的实例
其他值包括:request, session, application, websocket等,是在web程序中使用
<bean id="dog" name="gou,quan" class="com.qdu.bean.Dog"
scope="prototype" />
<bean id="sheep" class="com.qdu.bean.Sheep" />
<bean class="com.qdu.bean.Pig" />
- 对于单例的bean,容器启动的时候就会实例化 ,如果将lazy-init设置为true,则单例的bean在第一次请求的时候被实例化。scope为prototype的bean在每次请求的时候被实例化
- init-method指定初始化时要调用的方法
- destroy-method指定bean被摧毁前要调用的方法
<bean id="singleDog" class="com.qdu.bean.SingleDog"
lazy-init="true" init-method="init" destroy-method="destroy" />
在程序中获取bean的方式有:
- 可以根据bean的id获取bean的实例
- 可以根据bean的name获取bean的实例
- 可以根据bean的类型获取bean的实例
// 可以根据bean的id获取bean的实例
Dog d1 = (Dog) ctx.getBean("dog");
d1.eat();
// 也可根据bean的name(别名)获取bean的实例
Dog d2 = (Dog) ctx.getBean("gou");
d2.eat();
// 还可以根据bean的类型获取bean实例
Dog d3 = ctx.getBean(Dog.class);
d3.eat();
2 使用Java代码配置Spring程序
如果使用的是java配置类,而不是xml配置文件,则需要使用ApplicationContext接口的AnnotationConfigApplicationContext实现类来创建容器。
可以传入一个或多个配置类的类型,这样形成的容器管理这些配置类注册的bean
ApplicationContext ctx
= new AnnotationConfigApplicationContext(SpringConfig1.class, SpringConfig2.class);
在com.qdu下创建一个config包来存储Java配置类
相应注解:
- @Configuration说明类是一个java配置类
- @Bean表示方法返回的对象成为Spring管理的bean。默认一个bean是单例范围,也就是不管请求该bean多少次,返回的是同一个共享实例。这种方式注册的spring bean的名称是方法名;可通过@Bean注解的name属性指定bean的一个主名称和多个别名,如果指定了名称,则方法名就不作为bean的名称了
- 可通过@Bean注解的initMethod指定初始化时要调用的方法,方法名称随便起,但是不能有参数
- 可通过@Bean注解的destroyMethod指定bean摧毁前要调用的方法,方法名称随便起,但是不能有参数
- @Scope注解用于指定bean的范围,默认是singleton,还可以是prototype, request, session, application等
- @Lazy指示bean使用懒加载/延迟加载,默认单例的bean是容器启动就实例化。如果使用该注解,则是第一次请求该bean的时候实例化。
SpringConfig1.class:
@Configuration
public class SpringConfig1 {
@Bean(name= {"dog","gou","quan"})
@Scope("prototype")
public Dog dog() {
return new Dog();
}
@Bean
public Sheep sheep() {
return new Sheep();
}
@Bean(initMethod="init",destroyMethod="destroy")
@Lazy
public SingleDog singleDog() {
return new SingleDog();
}
}
在程序中获取bean的方式有:
- 可以根据bean的id获取bean的实例
- 可以根据bean的name获取bean的实例
- 可以根据bean的类型获取bean的实例
Dog d1 = (Dog) ctx.getBean("dog");
d1.eat();
Dog d2 = (Dog) ctx.getBean("gou");
d2.eat();
Dog d3 = ctx.getBean(Dog.class);
d3.eat();
3 使用注解配置Spring程序
若要使用注解配置,则需要在SpringConfig类中开启包扫描:
@Configuration
@ComponentScan(basePackages= {"com.qdu.bean"})
public class SpringConfig {
}
同2, 在这里我们使用的是java配置类,而不是xml配置文件,则需要使用ApplicationContext接口的AnnotationConfigApplicationContext实现类来创建容器。
ApplicationContext ctx
= new AnnotationConfigApplicationContext(SpringConfig.class);
在Dog类中别忘记添加注解@Component!!!
@Component //将一个bean注册为spring管理的bean,默认名称是首字母小写的类名
@Scope("prototype") //指定bean的范围,默认是singleton
public class Dog {
public Dog() {
System.out.println("实例化了Dog!!!");
}
public void eat() {
System.out.println("这是一只狗,狗吃骨头!");
}
}
除此之外,常用注解还有:
- @Lazy:延迟加载
- @PostConstruct:修饰的方法用于执行初始化工作
- @PreDestroy:修饰的方法在bean摧毁前调用,用于执行如释放资源等操作
- 方法名可以随便起,但是方法不能有参数!!!
在这里获取bean的方式有两种:
- 可以根据bean的id获取bean的实例
- 可以根据bean的类型获取bean的实例
// 可以根据bean的id获取bean的实例
Dog d1 = (Dog) ctx.getBean("dog");
d1.eat();
// 还可以根据bean的类型获取bean实例
Dog d2 = ctx.getBean(Dog.class);
d2.eat();