Spring Framework
- Spring的两个核心
- IOC控制反转
- IOC容器
- 依赖注入DI
- IOC容器实现
- 注解管理Bean
- Bean对象定义
- Bean对象获取
- AOP面向切面编程
- 添加依赖
- 入门案例
- 注解
- 通过Spring创建Java bean对象
- xml管理Bean案例
- main下创建bean.XMl文件
- DI依赖注入案例
- 创建Spring配置文件 bean-di.xml
- 注解管理Bean案例
Spring的两个核心
IOC控制反转
-
Inverse of Control的简写,为 控制反转,指是将对象的创建和管理交由Spring框架来完成,而不是由开发人员手动创建和管理
-
即:反转资源获取方向,把自己创建资源、向环境索取资源的方式变为环境自动将资源准备好,我们享受资源注入
IOC容器
-
IoC容器是用来实现IoC思想的一个工具或者说技术手段
-
它能够自动扫描应用程序中的对象,将它们实例化,并自动注入它们所需要的依赖对象,使应用程序的开发人员能够更加专注于业务逻辑的实现,而不用关心对象的创建和管理。Spring通过IoC容器来管理所有的Java对象的实例化和初始化,控制着对象与对象之间的依赖关系
依赖注入DI
- DI (Dependency Injection):依赖注入,依赖注入实现了控制反转的思想,是指Spring创建对象的过程中,将对象依赖属性通过配置进行注入
- 所以 IoC 是一种控制反转的思想,而依赖注入 DI 是对 IoC 的一种具体实现
- Bean管理:指Bean对象的创建,以及Bean对象中属性的赋值
IOC容器实现
Spring中的IoC容器就是IoC思想的一个落地产品实现。IoC容器中管理的组件也叫做bean。在创建bean之前,首先需要创建IoC容器,Spring提供了IoC容器的两种实现方式
-
BeanFactory
这是IoC容器的基本实现,是Spring内部使用的接口,面向Spring本身,不提供给开发人员使用。 -
ApplicationContext
BeanFactory的子接口,提供了更多高级特性,面向Spring的使用者,几乎所有场合都使用 ApplicationContext,而不使用底层的BeanFactory。
ApplicationContext的主要实现类
类型 | 说明 |
---|---|
AnnotationConfigApplicationContext | 使用注解方式构建IoC容器 |
ClassPathXmlApplicationContext | 使用XML配置文件方式构建Spring IoC容器 |
注解管理Bean
Bean对象定义
在Spring框架规范中,所有由spring管理的对象都称之为Bean对象。
Spring提供了以下多个注解,这些注解可以直接标注在java类上,将它们定义成Spring Bean。
注解 | 说明 |
---|---|
@Component | 该注解用于描述Spring中的Bean,它是一个泛化的概念,仅仅标识容器中的一个组件(Bean),并且可以作用在任何层次,例如Service层、Dao层等,使用时只需将该注解标注在相应的类上即可。 |
@Repository | 该注解用于数据访问层(Dao层)的类标识为Spring中的Bean,功能与@Component相同。 |
@Service | 该注解通常作用在业务层(Service层),用于将业务层的类标识为Spring中的Bean,其功能与@Component相同。 |
@Controller | 该注解通常作用在控制层(如SpringMVC的Controller),用于将控制层的类标识为Spring中的Bean,其功能与@Component相同。 |
Bean对象获取
ApplicationContext context = new AnnotationConfigApplicationContext("包扫描路径");
User user = context.getBean(类名.class);
AOP面向切面编程
Aspect Oriented Programming 的简写,为 面向切面编程。AOP用来封装多个类的公共行为,将那些与业务无关,却为业务模块共同调用的逻辑封装起来,减少系统的重复代码。
添加依赖
<dependencies>
<!-- Maven坐标:
https://mvnrepository.com/artifact/org.springframework/spring-context -->
<!-- 引入spring context依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.24</version>
</dependency>
</dependencies>
入门案例
注解
- @Component
注解描述的类,表示此类交给Spring框架管理
package cn.tedu.spring.example;
import org.springframework.stereotype.Component;
@Component
public class User {
public void userRun(){
System.out.println("User is do something~~");
}
}
通过Spring创建Java bean对象
- AnnotationConfigApplicationContext扫描这个包中所有带有@Component注解的类,并根据这些类创建相应的Spring组件
package cn.tedu.spring.example;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class TestUser {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext("cn.tedu.spring.example");
User user1 = context.getBean(User.class);
System.out.println("user1 = " + user1);
user1.userRun();
}
}
xml管理Bean案例
- 在Spring框架中,Bean的配置可以通过 XML 文件来完成。这个文件通常被称为 Spring 配置文件或 Spring XML 文件。
package cn.tedu.spring.example;
public class UserXml {
private String username;
private String password;
public void run(){
System.out.println("今天天气不错挺风和日丽的~");
}
}
main下创建bean.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="userXml" class="cn.tedu.spring.example.UserXml"></bean>
</beans>
package cn.tedu.spring.example;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestUserXml {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
UserXml userXml = (UserXml)context.getBean("userXml");
userXml.run();
}
}
DI依赖注入案例
package cn.tedu.spring.dibase;
public class Book {
private String bookName;
private String bookAuthor;
public void setBookName(String bookName) {
this.bookName = bookName;
}
public void setBookAuthor(String bookAuthor) {
this.bookAuthor = bookAuthor;
}
@Override
public String toString() {
return "Book{" +
"bookName='" + bookName + '\'' +
", bookAuthor='" + bookAuthor + '\'' +
'}';
}
}
创建Spring配置文件 bean-di.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="book" class="cn.tedu.spring.dibase.Book">
<property name="bookName" value="倚天屠龙记" />
<property name="bookAuthor" value="金庸"/>
</bean>
</beans>
package cn.tedu.spring.dibase;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestBook {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("bean-di.xml");
Book book = context.getBean(Book.class);
System.out.println("book = " +book);
}
}
注解管理Bean案例
- @Value
@Value注入是将属性值直接注入到bean中,主要用于注入一些简单类型的属性(如字符串、基本类型等);
使用时需要注意属性的类型和格式,否则会导致注入失败。 - @Autowired
@Autowired注入是将对象注入到bean中,并且在注入对象时会根据依赖注入容器中 bean的类型 进行匹配。
如果容器中有多个类型匹配的bean存在,则会抛出异常。因此,@Autowired注入常用于注入复杂对象、接口类型的属性或其他bean实例。
package cn.tedu.spring.bean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Repository;
@Repository
public class UserDao {
@Value("jdbc:mysql://localhost:3306/tedu")
private String dbUrl;
@Value("root")
private String username;
private String password;
@Value("qwertyuiop")
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "UserDao{" +
"dbUrl='" + dbUrl + '\'' +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
package cn.tedu.spring.bean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
@Service
public class UserService {
@Value("注册业务")
private String serveName;
@Autowired
private UserDao userDao;
@Override
public String toString() {
return "UserService{" +
"serveName='" + serveName + '\'' +
", userDao=" + userDao +
'}';
}
}
package cn.tedu.spring.bean;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class TestUserDao {
@Test
public void testBean(){
ApplicationContext context = new AnnotationConfigApplicationContext("cn.tedu.spring.bean");
UserDao userDao = context.getBean(UserDao.class);
System.out.println("userDao = " + userDao);
}
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext("cn.tedu.spring.bean");
UserService userService = context.getBean(UserService.class);
System.out.println("userService:"+ userService);
}
}