目录
一、简介
下载地址:
1、什么是Spring?
Spring是一个开源的Java开发框架,它简化了Java应用程序的开发过程,提供了一套全面的、一致性的编程模型,使得开发者可以更轻松地构建可扩展、可维护的企业级应用程序。
2、Spring框架的核心特性
- 控制反转(IoC):Spring通过IoC容器管理对象之间的依赖关系,简化了对象之间的耦合。
- 面向切面编程(AOP):Spring的AOP支持允许开发者在程序运行过程中动态地添加功能(例如事务管理、日志记录等)。
- 数据访问:Spring提供了对多种数据访问技术的支持,如JDBC、ORM框架、NoSQL等。
- 事务管理:Spring提供了一致的事务管理抽象,使得开发者可以在不同的事务管理实现之间切换。
- MVC框架:Spring的MVC框架使得开发者可以轻松地构建Web应用程序。
- 安全性:Spring提供了对身份认证和授权的支持,帮助开发者构建安全的应用程序。
3、优点
轻量级:Spring框架核心库非常轻量,通过模块化的设计,开发者可以选择所需的模块,避免了不必要的依赖。
松耦合:Spring框架采用依赖注入(DI)和面向接口编程的方式,使得应用程序各个组件之间的耦合度降低,易于维护和测试。
面向切面编程:Spring框架支持面向切面编程(AOP),可以解耦横切关注点(如事务管理、日志记录等),提高代码的复用性和可维护性。
容器管理:Spring框架提供了一个容器(IoC容器),可以统一管理应用程序中的对象,通过配置文件或注解方式管理对象的创建和销毁。
事务管理:Spring框架提供了强大的事务管理支持,可以通过声明式事务的方式简化事务管理的代码,减少样板代码的编写。
灵活性:Spring框架提供了丰富的扩展机制,可以与其他框架(如Hibernate、MyBatis等)无缝集成,也支持多种数据库连接池、日志等第三方组件的集成。
测试支持:Spring框架提供了对单元测试和集成测试的强大支持,可以方便地测试代码的正确性和性能。
社区活跃:Spring框架是一个开源项目,拥有庞大的社区支持和活跃的开发者社群,可以获得丰富的文档、教程和解决方案。
总的来说,Spring框架是一款功能强大、灵活性高、易于扩展和维护的Java开发框架,适用于各种规模和类型的应用程序开发。
二、IOC容器
介绍
IOC:控制反转(Inversion of Control)
1、获取资源的传统方式
在应用程序中的组件需要获取资源时,传统的方式是组件主动的从容器中获取所需要的资源,在这样的模式下开发人员往往需要知道在具体容器中特定资源的获取方式,增加了学习成本,同时降低了开发效率。
2、控制反转方式获取资源
反转控制的思想完全颠覆了应用程序组件获取资源的传统方式:反转了资源的获取方向——改由容器主动的将资源推送给需要的组件,开发人员不需要知道容器是如何创建资源对象的,只需要提供接收资源的方式即可,极大的降低了学习成本,提高了开发的效率。这种行为也称为查找的被动形式。
3、DI
DI:Dependency Injection,翻译过来是依赖注入。
DI 是 IOC 的另一种表述方式:即组件以一些预先定义好的方式(例如:setter 方法)接受来自于容器的资源注入。相对于IOC而言,这种表述更直接。
IOC 就是一种反转控制的思想, 而 DI 是对 IOC 的一种具体实现。
4、IOC容器在Spring中的实现
Spring 的 IOC 容器就是 IOC 思想的一个落地的产品实现。IOC 容器中管理的组件也叫做 bean。在创建bean 之前,首先需要创建 IOC 容器。Spring 提供了 IOC 容器的两种实现方式:
1、BeanFactory
这是IOC容器的基本实现,是Spring内部使用的接口。面向Spring本身,不提供给开发人员使用。
2、ApplicationContext
BeanFactory的子接口,提供了更多高级特性。面向Spring的使用者,几乎所有场合都使用ApplicationContext而不是底层的Bean Factory。
入门案例
1、创建Maven Module
2、引入依赖
<dependencies>
<!-- 基于Maven依赖传递性,导入spring-context依赖即可导入当前所需所有jar包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.1</version>
</dependency>
<!-- junit测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
3、创建HelloWorld类
public class HelloWorld {
public void sayHello(){
System.out.println("helloworld");
}
}
4、在Spring的配置文件中配置bean
<bean id="helloworld" class="com.atguigu.spring.bean.HelloWorld"></bean>
5、创建测试类测试
@Test
public void testHelloWorld(){
ApplicationContext ac = newClassPathXmlApplicationContext("applicationContext.xml");
HelloWorld helloworld = (HelloWorld) ac.getBean("helloworld");
helloworld.sayHello();
}
6、思路
7、注意
Spring 底层默认通过反射技术调用组件类的无参构造器来创建组件对象,这一点需要注意。
三、基于注解管理Bean
3.1、Bean对象定义及获取
在Spring框架规范中,所有由spring管理的对象都称之为Bean对象
3.2、Bean对象定义
Spring提供了以下多个注解,这些注解可以直接标注在java类上,将它们定义成Spring Bean。
注解 | 说明 |
---|---|
@Component | 该注解用于描述Spring中的Bean,它是一个泛化的概念,仅仅标识容器中的一 个组件(Bean),并且可以作用在任何层次,例如Service层、Dao层等,使用时只需将该注解标注在相应的类上即可。 |
@Respository | 该注解用于数据访问层(Dao层)的类标识为Spring中的Bean,功能与 @Component相同。 |
@Service | 该注解通常作用在业务层(Service层),用于将业务层的类标识为Spring中的 Bean,其功能与@Component相同。 |
@Controller | 该注解通常作用在控制层(如SpringMVC的Controller),用于将控制层的类标 识为Spring中的Bean,其功能与@Component相同。 |
3.3、Bean对象获取
通过ApplicationContext对象获取:调用ApplicationContext对象的getBean()方法,传入对应类的类型 即可获取该Bean对象,示例:
ApplicationContext context = new AnnotationConfigApplicationContext("包扫描路径");
User user = context.getBean(类名.class);
3.4、应用分析
在 cn.spring 下创建子包 bean ,进行 bean 对象的创建及获取、
第1步:在bean包下创建类:UserDao
@Repository
public class UserDao {
private String databaseUrl;
private String username;
private String password;
}
第2步:在bean包下创建测试类:UserDaoTest
public class TestUserDao {
@Test
public void testBean(){
ApplicationContext context = new
AnnotationConfigApplicationContext("cn.spring.bean");
UserDao userDao = context.getBean(UserDao.class);
System.out.println("userDao = " + userDao);
}
}
说明:将java类中的 @Repository注解 替换为 @Component注解、@Service注解、@Controller注 解 都是可以的。
3.5、依赖注入
3.5.1、 @Value注解
@Value注入是将属性值直接注入到bean中,主要用于注入一些简单类型的属性(如字符串、基本类型 等); 使用时需要注意属性的类型和格式,否则会导致注入失败。
示例:在UserDao中进行属性值注入
第1步:在UserDao的属性中通过@Value注解注入属性值
@Repository
public class UserDao {
@Value("jdbc:mysql://localhost:3306/")
private String databaseUrl;
@Value("root")
private String username;
@Value("root")
private String password;
@Override
public String toString() {
return "UserDao{" +
"databaseUrl='" + databaseUrl + '\'' +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
第2步:执行测试方法进行测试
3.5.2、@Autowired注解
@Autowired注入是将对象注入到bean中,并且在注入对象时会根据依赖注入容器中bean的类型进行匹 配。如果容器中有多个类型匹配的bean存在,则会抛出异常。因此,@Autowired注入常用于注入复杂 对象、接口类型的属性或其他bean实例。
3.5.2.1、 根据类型注入
定义UserService类,并注入UserDao对象
第1步:在包bean下创建 UserService 类
@Service
public class UserService {
@Value("注册业务")
private String sname;
// Autowired自动装配
@Autowired
private UserDao userDao;
@Override
public String toString() {
return "UserService{" +
"sname='" + sname + '\'' +
", userDao=" + userDao +
'}';
}
}
第2步:调整测试方法
@Test
public void testAuto(){
ApplicationContext context = new
AnnotationConfigApplicationContext("cn.spring.bean");
UserService userService = context.getBean(UserService.class);
System.out.println("userService = " + userService);
}
第3步:执行测试方法测试