三种配置Spring程序的方法

2023-12-13 04:40:03

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的方式有:

  1. 可以根据bean的id获取bean的实例
  2. 可以根据bean的name获取bean的实例
  3. 可以根据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的方式有:

  1. 可以根据bean的id获取bean的实例
  2. 可以根据bean的name获取bean的实例
  3. 可以根据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的方式有两种:

  1. 可以根据bean的id获取bean的实例
  2. 可以根据bean的类型获取bean的实例
// 可以根据bean的id获取bean的实例
Dog d1 = (Dog) ctx.getBean("dog"); 
d1.eat();
		
// 还可以根据bean的类型获取bean实例
Dog d2 = ctx.getBean(Dog.class); 
d2.eat();

?

文章来源:https://blog.csdn.net/amdkk/article/details/134819356
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。