spring IoC——用注解的方式实现

  • Post author:
  • Post category:其他




目录



说明

本例子不是web项目,主要内容是依赖注入的注解实现。



配置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:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">
          
	<!-- 开启自动扫描text2_IoC包下的所以类的注释 注释方式IoC -->
	<context:component-scan base-package="text2_IoC"></context:component-scan>
	      
</beans>


说明:


开启注解



IoC注解的分类

	1. 注册bean的注解(类级别)
			1) @Component:通用注册bean的注解
			2) @Service:注册service层的bean
			3) @Repository:注册DAO层的bean
			4) @Controller:注册控制层的bean
		注意:上述四个注解可以给bean其名字,如果没有命名,则名字默认是类的名字的第一个字母小写
	2. 注入bean的注解
			1) @Autowired:自动注入bean,可以用在属性字段上,set方式上,构造器上
			2) @Qualifier("bean名称"):和@Autowired配合使用,帮助@Autowired注入确定范围,可以用在方法的参数前
			3) @Resource:这能用在set方法上,可以指定具体注册的bean名称 @Resource("bean名称")
	3. 设置bean参数的注解
			1) @Order(2):给相同类型的bean编序(类级别)
			2) @Scope:设置bean的作用域,五个(类级别)
			3) @PostConstruct:定义bean的初始化方法(方法级别)
			4) @PreDestroy:定义bean的销毁方法(方法级别)
	4. @bean注解
			注册bean的注解(方法级别),和@Configuration配合使用(类级别)
			//定义一个bean,名字自定义为stringStore,类型StringStore实现了Store 接口,初始化方法是init,结束方法是destroy
			@Bean(name = "stringStore", initMethod="init", destroyMethod="destroy")
			public Store stringStore() {
				return new StringStore();
			}
	5. 获取外部文件数据的注解
			1) @Configuration:配合下面一个注解使用(类级别)
			2) @ImportResource("classpath:config.xml"):引入外部文件 config.xml(类级别)
			3) @Value("${jdbc.username}"):将文件中的键值为jdbc.username的值注入成员变量中(字段级别)
	6. 新注解
			1) @Named:等价@Component+@Qualifier("bean名称"),可以在类上定义bean,还可以在字段和方法、参数上配合@Inject使用
			2) @Inject:等价@Autowired
		注意:收到spring的版本限制,需要引入javax.inject.jar包


说明:


用@Bean注册bean是在一个单独的类中注册其他已经实现的类

bean的作用域:

1.singleton单例模式(默认),

2.prototype原型模式,每次获取Bean时会创建一个新的实例

3.request

4.session

5.global session



注解使用的样例

注解使用的样例,

代码片

.

package text2_IoC;

1) @Configuration:配合下面一个注解使用(类级别)
2) @ImportResource("classpath:config.xml"):引入外部文件 config.xml(类级别)

1) @Component:通用注册bean的注解
2) @Service:注册service层的bean
3) @Repository:注册DAO层的bean
4) @Controller:注册控制层的bean

1) @Named:等价@Component+@Qualifier("bean名称"),可以在类上定义bean,还可以在字段和方法、参数上配合@Inject使用

1) @Order(2):给相同类型的bean编序(类级别)
2) @Scope:设置bean的作用域,五个(类级别)

public class 这是一个需要注解的类 {
	
	1) @Autowired:自动注入bean,可以用在属性字段上,set方式上,构造器上
	2) @Qualifier("bean名称"):和@Autowired配合使用,帮助@Autowired注入确定范围,可以用在
	private Object 字段;
		
	3) @Value("${jdbc.driver}"):将文件中的键值为jdbc.driver的值注入成员变量中(字段级别)
	private String driver;
	3) @Value("${jdbc.url}"):将文件中的键值为jdbc.url的值注入成员变量中(字段级别)
	private String url;
	3) @Value("${jdbc.username}"):将文件中的键值为jdbc.username的值注入成员变量中(字段级别)
	private String username;
	3) @Value("${jdbc.password}"):将文件中的键值为jdbc.password的值注入成员变量中(字段级别)
	private String password;

	
	1) @Autowired:自动注入bean,可以用在属性字段上,set方式上,构造器上
	2) @Qualifier("bean名称"):和@Autowired配合使用,帮助@Autowired注入确定范围,可以用在
	public 这是一个需要注解的类(Object 字段){//构造方法
		this.字段=字段;
	}
	
	1) @Autowired:自动注入bean,可以用在属性字段上,set方式上,构造器上
	2) @Qualifier("bean名称"):和@Autowired配合使用,帮助@Autowired注入确定范围,可以用在
	3) @Resource:这能用在set方法上,可以指定具体注册的bean名称 @Resource("bean名称")
	
	2) @Inject:等价@Autowired
	public void set字段(@Named("bean名称") Object 字段) {//set方法
		this.字段 = 字段;
	}
	
	//定义bean的初始化方法
	3) @PostConstruct:定义bean的初始化方法(方法级别)
	public void init() {
		System.out.println("初始化方法");
	}
		
	//定义bean的销毁方法
	4) @PreDestroy:定义bean的销毁方法(方法级别)
	public void destroy() {
		System.out.println("销毁方法");
	}
	
	//定义一个bean,名字自定义为stringStore,类型StringStore实现了Store 接口,初始化方法是init,结束方法是destroy
	@Bean(name = "stringStore", initMethod="init", destroyMethod="destroy")
	public Store stringStore() {
		return new StringStore();
	}
	
	//定义一个bean,名字是myDriverManager,实现接口是MyDriverManager,类是MyDriverManager(url, username, password)
	@Bean
	public MyDriverManager myDriverManager() {
		return new MyDriverManager(driver,url, username, password);
	}	
}


说明:


上面代码只是样例不能运行,用@Bean注册bean是在一个单独的类中注册其他已经实现的类。



样例的实例


代码片

.

package text2_IoC;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;
import javax.inject.Inject;
import javax.inject.Named;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource;
import org.springframework.context.annotation.Scope;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;

@Configuration //配合下面一个注解使用(类级别)
@ImportResource("classpath:config.xml") //引入外部文件 config.xml(类级别)

@Component //通用注册bean的注解
@Service //注册service层的bean
@Repository //注册DAO层的bean
@Controller //注册控制层的bean

@Named //等价@Component+@Qualifier("bean名称"),可以在类上定义bean,还可以在字段和方法、参数上配合@Inject使用

@Order(2) //给相同类型的bean编序(类级别)
@Scope //设置bean的作用域,五个(类级别)

public class 这是一个需要注解的类{

   
   @Autowired//自动注入bean,可以用在属性字段上,set方式上,构造器上
   @Qualifier("bean名称") //和@Autowired配合使用,帮助@Autowired注入确定范围,可以用在
   private Object 字段;
   	
   @Value("${jdbc.driver}") //将文件中的键值为jdbc.driver的值注入成员变量中(字段级别)
   private String driver;
   @Value("${jdbc.url}") //将文件中的键值为jdbc.url的值注入成员变量中(字段级别)
   private String url;
   @Value("${jdbc.username}") //将文件中的键值为jdbc.username的值注入成员变量中(字段级别)
   private String username;
   @Value("${jdbc.password}") //将文件中的键值为jdbc.password的值注入成员变量中(字段级别)
   private String password;

   
   @Autowired //自动注入bean,可以用在属性字段上,set方式上,构造器上
   public 这是一个需要注解的类(@Qualifier("bean名称") Object 字段){//构造方法
   		this.字段=字段;
   }
   
   @Autowired //自动注入bean,可以用在属性字段上,set方式上,构造器上
   @Qualifier("bean名称") //和@Autowired配合使用,帮助@Autowired注入确定范围,可以用在
   @Resource//这能用在set方法上,可以指定具体注册的bean名称 @Resource("bean名称")
   
   @Inject //等价@Autowired
   public void set字段(@Named("bean名称") Object 字段) {//set方法
   		this.字段 = 字段;
   }
   
   //定义bean的初始化方法
   @PostConstruct //定义bean的初始化方法(方法级别)
   public void init() {
   		System.out.println("初始化方法");
   }
   	
   //定义bean的销毁方法
   @PreDestroy //定义bean的销毁方法(方法级别)
   public void destroy() {
   		System.out.println("销毁方法");
   }
   
   
   //定义一个bean,名字自定义为stringStore,类型StringStore实现了Store 接口,初始化方法是init,结束方法是destroy
   @Bean(name = "stringStore", initMethod="init", destroyMethod="destroy")
   public Store stringStore() {
   		return new StringStore();
   }
   
   //定义一个bean,名字是myDriverManager,实现接口是MyDriverManager,类是MyDriverManager(url, username, password)
   @Bean
   public MyDriverManager myDriverManager() {
   		return new MyDriverManager(driver, url, username, password);
   }
   
}


说明


需要引入javax.inject.jar



总结

	1. 使用注解的方式来实现IoC相对于配置方式更加方便,可以大大的简化开发过程。
	2. 注解的内容只是简单的梳理了一下。
**引用包是最大的困难(一步一步来)**



版权声明:本文为qq_37051166原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。