Spring框架有四大原则:
1) 使用pojo进行轻量级和最小侵入式开发;
2)通过依赖注入和使用接口编程实现松耦合;
3) 通过AOP和默认习惯进行声明式编程;
4)使用AOP和模板减少样板化代码。
Spring 所有的功能设计和实现都是基于这四大原则的。
1. 控制反转&依赖注入
我们通常所说的反转控制和依赖注入在Spring下是等同的概念,控制反转是通过依赖注入实现的。所谓依赖注入是指容器负责创建对象和维护对象之间的依赖关系,而不是通过对象本身负责自己的创建和解决自己的依赖。
依赖注入的主要目的是为了解耦,体现了一种“组合”的概念。如果你希望你的类具备某项功能的时候,是继承自具有此功能的一个父类好?还是组合另一个具有这个功能的类好呢?当然,答案是不言而喻的,继承一个父类,那么子类将于父类耦合,组合一个类则使得耦合度大大降低。
Spring IOC容器(ApplicationContext)负责创建Bean,并通过容器将功能类注入到你需要的Bean中 。Spring提供xm、注解、Java配置、groovy配置实现Bean的创建和注入。
无论是xml配置、注解还是Java配置,都被称为配置元数据,所谓元数据即指的是描述数据的数据。元数据本身不具备任何可执行的能力 ,只能通过外界代码来对这些元数据行进行解析后进行一些有意义的操作。Spring容器解析这些配置元数据进行Bean的初始化、配置和依赖管理。
声明Bean的注解:
- @Component 组件,没有明确的角色。
- @Service 在业务逻辑层(service)使用。
- @Repository,在数据访问层(dao)使用。
- @Controller 在表现层使用(MVC-->Spring MVC)。
注入Bean的注解,一般情况下通用:
- @Autowired ,Spring提供的注解
- @Inject JSR-330提供的注解
-@Resource JSR-250提供的注解
@Autowired、@Inject、@Resource 均可注解在属性或set方法上,一般习惯是将其注解在属性上,这样的优点是,代码更少、层次更清晰。
2.基本配置
以下代码演示基于注解的Bean的初始化和依赖注入,Spring容器选用AnnotationConfigApplicationContext。
(1)编写功能能类的Bean
package com.hsun.spring.service;
import org.springframework.stereotype.Service;
/**
*①使用@Service声明当前FuncationService类是Spring所管理的一个Bean,
*其中使用@Component、*@Service、@Repository和@Controller是等效的,可根据需要选用。
*/
@Service//1
public class FuncationService {
public String sayHello(String word) {
return "Hello " + word + "!";
}
}
(2)使用功能类的Bean
package com.hsun.spring.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service//使用@Service注解四横名当前类是一个Spring所管理的Bean
public class UseFuncationService {
/**
* 使用@Autowired将FuncationService注入到当前类中,
* 使得UseFuncationService类具有FuncationService类的功能,此处使用JSR-330提供
* 的@Inject注解或者是JSR-250提供的@Resource注解是等效的。
*/
@Autowired//2
private FuncationService funcationService;
public String sayHello(String word) {
return funcationService.sayHello(word);
}
}
(3) 配置类
package com.hsun.spring.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration//1 @Configration声明当前类是一个配置类
@ComponentScan("com.hsun.spring.service")//2
/**
* 使用@ComponentScan,自动扫描包下所有
* @Service、@Repository、@Controller、@Component
* 的类,并注册为Bean
*/
public class DiConfig {
}
(4)运行
package com.hsun.spring;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import com.hsun.spring.config.DiConfig;
import com.hsun.spring.service.UseFuncationService;
public class App {
public static void main(String[] args) {
AnnotationConfigApplicationContext app =
new AnnotationConfigApplicationContext(DiConfig.class);//1
//使用AnnotationConfigApplicationContext作为Spring的容器,接收一个配置类作为参数
UseFuncationService useFuncationService =
app.getBean(UseFuncationService.class);//2
//获得生命配置的UseFuncationService的Bean
System.out.println(useFuncationService.sayHello("world"));
app.close();
}
}
结果如下:
以上示例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.hsun</groupId>
<artifactId>spring</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.7.RELEASE</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven,plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.3</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
</plugins>
</build>
</project>