天天看点

基于注解的IOC注解的配置

基于注解的IOC

  • 注解的配置
    • 导入jar包,具体需要的jar包如下
    • 用于创建bean对象
    • XML配置
    • 注入数据
    • 用于改变作用范围
    • Spring的新注解

注解的配置

导入jar包,具体需要的jar包如下

基于注解的IOC注解的配置
  • maven配置
<!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>4.2.4.RELEASE</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/org.springframework/spring-beans -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-beans</artifactId>
			<version>4.2.4.RELEASE</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>4.2.4.RELEASE</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/org.springframework/spring-aop -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-aop</artifactId>
			<version>4.2.4.RELEASE</version>
		</dependency>
           

用于创建bean对象

  • @componet
    • 作用:就相当于配置了一个bean标签
    • 它出现的位置:类上面
    • 属性:value。含义是指bean的id。当不写时,它有默认值。默认值是当前类的短名,首字母小写
  • 由此注解衍生的三个注解
    • @Controller 一般用于表现层
    • @Service 一般用于业务层
    • @Repository 一般用于持久层
    • 他们和@Componet的作用以及属性一摸一样
@Service
public class CustomerServiceImpl implements ICustomerService{
	private ICustomerDao customerDao;
	
	public void setCustomerDao(ICustomerDao customerDao) {
		this.customerDao = customerDao;
	}
	
	public void saveCustomer() {
		System.out.println("业务层调用持久层");
	}

}
           

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">
	<!-- 配置自动扫描仪 -->
	<context:component-scan base-package="fujuspring.com.fuju.service"></context:component-scan>
</beans>
           

注入数据

  • @Autowired
    • 作用:自动按照类型注入
    • 当我们使用注解注入的时候,set方法就不是必须的了
    • 如果注入的bean在容器中类型不唯一时,它会把变量名称作为bean的id在容器中查找,找到后也会注入成功
    • 如果没有找到一致的bean的id,则报错
  • @Qualifier
    • 作用:在自动按照类型注入的基础上,再按照bean的id注入,它在类成员注入数据时,不能独立使用,但是在给方法的形参注入数据时,可以独立使用
    • 属性
      • value:用于指定bean的id
  • @Resource
    • 作用:直接按照bean的id注入
      • 属性:
        • name:用于指定bean的id
  • 以上三个注解都是用于注入其他bean类型的。用于注入基本类型和String类型需要使用Value
  • @Value
    • 作用:用于注入基本类型和String类型数据。可以借助spring的el表达式读取properties文件中的配置
    • 属性:value:用于指定要注入的数据

== java代码 ==

@Repository("customerDaoImpl")
public class CustomerDaoImpl implements ICustomerDao {

	public void saveCustomer() {
		System.out.println("持久层保存了客户");
	}

}
           
@Service("customerServiceImpl")
public class CustomerServiceImpl implements ICustomerService{
	@Value("XXX")
	private String name;
	
	@Autowired
//	@Qualifier("customerDaoImpl")
	private ICustomerDao customerDao;
	
	public void saveCustomer() {
		System.out.println("业务层调用持久层"+name);
		customerDao.saveCustomer();
	}

}
           

用于改变作用范围

  • @Scope
    • 用于改变bean的作用范围
    • 属性:value:用于指定范围的值
      • 取值和xml中的scope属性的取值是一样的。singleton prototype request session globalsession

== java代码如下 ==

@Service("customerServiceImpl")
@Scope("prototype")
public class CustomerServiceImpl implements ICustomerService{
	@Value("XXX")
	private String name;
	
	@Autowired
//	@Qualifier("customerDaoImpl")
	private ICustomerDao customerDao;
	
	public void saveCustomer() {
		System.out.println("业务层调用持久层"+name);
		customerDao.saveCustomer();
	}

}
           

Spring的新注解

  • @ComponentScan
    • 配置自动扫描
  • @Bean
    • 作用:它是把方法的返回值存在spring容器中,该注解有个属性有个name用于指定bean的ID,当不指定时,它有默认值,默认值是方法的名称
  • @Configuration
    • 作用:把当前类看做spring的配置类
  • @Import
    • 作用:导入其他配置类
  • @PropertySource
    • 作用:加载配置文件如jdbc.properties,可以解析占位符