控制反转和依赖注入
Spring 通过依赖注入实现控制反转.
JavaEE 项目通过工厂模式实现控制反转.
Spring 的依赖注入原理也是基于工厂模式.
Spring 提供了使用 xml,注解,java 配置,groovy 配置实现依赖注入.
测试环境说明
1. 使用 myeclipse 创建 maven 项目,jdk 基于 1.7
2. 填写 maven 项目 GAV(三坐标)
3. 项目结构
4.pom.xml 文件信息
常用注解
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.etc</groupId>
<artifactId>spring4demo01</artifactId>
<version>1.0.0-SNAPSHOT</version>
<properties>
<java.version>1.7</java.version>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.1.9.RELEASE</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
声明 bean 的注解
注解 说明
@Component 声明组件注解,bean 没有明确角色.
@Service 业务逻辑层声明 bean 组件使用(service 层或者 biz 层).
@Repository 数据访问层声明 bean 组件使用(dao 层).
@Controller MVC 模型中,在控制层(C)声明 bean 组件层使用.
以上注解位于:org.springframework.stereotype
注入 bean 的注解
注解 说明
@AutoWired 按照类型装配注入,可以不通过 getter 和 setter 访问器注入.
@Qualifier
通常和 @AutoWired 注解配合使用.
如果 @AutoWired 找到多个可以装配类型,
则可以通过 @Qualifier 注解指定 bean 名称注入.
用法:@Qualifier("entityDao")
@Resource
JSR-250 提供的注解,位于 javax.annotation 包下.
注入时候默认按照名称注入,如果无法匹配名称,则转换为按照类型注入.
名称指属性名称或者 setter 访问器方法名.
@Inject 用法和 @AutoWired 类似.
示例代码
数据访问层代码
业务逻辑层代码
package com.etc.dao;
import org.springframework.stereotype.Repository;@Repository //数据访问层注解
public class EntityDao {
public String getData() {
return "get data from database";
}
}
配置类代码
package com.etc.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.etc.dao.EntityDao;
@Service //service层注解
public class EntityService {
@Autowired //注入bean
private EntityDao entityDao;
public String getData(){
return entityDao.getData();
}
}
测试类
package com.etc.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration //声明DiConfig类为配置类
@ComponentScan("com.etc.service,com.etc.dao") //扫描service和dao包所有使用注解声明的bean,并创建和注册为spring bean
public class DiConfig {
}
测试结果
package com.etc.test;
import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import com.etc.config.DiConfig;
import com.etc.service.EntityService;
public class TestClass {
/**测试使用注解实现IOC*/
@Test public void test1() {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(DiConfig.class);
EntityService es = context.getBean(EntityService.class);
System.out.println(es.getData());
context.close();
}
}
一月15,
2018 9 : 22 : 54上午org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefresh信息: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@442c8ab0: startup date[Mon Jan 15 09 : 22 : 54 CST 2018];
root of context hierarchy get data from database一月15,
2018 9 : 22 : 54上午org.springframework.context.annotation.AnnotationConfigApplicationContext doClose信息: Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@442c8ab0: startup date[Mon Jan 15 09 : 22 : 54 CST 2018];
root of context hierarchy
来源: http://www.bubuko.com/infodetail-2461808.html