Spring-简介,配置,ioc,自动装配,注解-Spring01
优点
- 开源,免费的框架
- 轻量级的,非入侵式的框架
- 控制反转(IOC),面向切面编程(AOP)
- 支持事务处理,对框架整合的支持
Spring式一个轻量级的控制反转和面向切面编程的框架
扩展
Springboot
- 一个快速开发的脚手架
- 基于springboot可以快速开发单个微服务
- 约定大于配置
Spring Cloud
- SpringCloud是基于springboot实现的
因为现在大多数公司都在使用SpringBoot进行快速开发学习SpringBoot的前提,需要完全掌握Spring和SpringMVC
弊端:
配置十分繁琐,人称:“配置地狱”
IOC
- UserDao
- UserDaoImpl 实现类
- UserService 业务接口
- UserServiceImpl 业务实现类
在我们之前的业务中,用户的需求可能影响我们原来代码,需要根据用户需求修改原代码,程序代码量大,修改的成本昂贵
使用set接口实现
之前,程序是主动创建对象,控制权在程序员中
使用set注入后,程序不再具有主动性,而是变成了被动接受对象
这种思想,本质上解决了问题,程序员不用管理对象的创建了,系统耦合性大大降低,可以更加专注在业务实现上,这是IOC原型
控制反转是设置思想,DI(依赖注入)是实现ioc的一种方法,获得依赖对象的方式反转了
控制反转是一种通过描述(xml或注解)并通过第三方去生产或获取特定对象的方式。在Spring中实现控制反转的是ioc容器,其实现方法是依赖注入(DI)
ioc:对象由Spring创建,管理,装配
ioc创建对象
使用无参构造创建对象,默认
假设要使用有参构造
- 下标赋值 constructor index
- 类型(不建议用)
- 直接通过参数名
总结:在配置文件加载的时候,容器中管理的对象就已经初始化了
Spring配置
- 别名
alias
- bean配置
id:bean的唯一标识符,也是相当于我们学的对象名
class:bean对象所对应的权限定名:包名+类型
name:也是别名,而且name同时取多个别名
- import
可以用import合并xml
依赖注入(DI)
- 构造器注入
- set方式注入(重点)
- 依赖注入:set注入
-
- 依赖:bean对象中的创建都依赖容器
- 注入:bean对象中的所有属性,由容器来注入
-
拓展方式
可以使用p命名空间和c命名空间进行注入
不能直接使用,需要导入xml约束
bean的作用域
单例模式(默认机制)
scope=“singleton”
原型模式:每次从容器中ge的时候,都会产生一个新对象
scope=“prototype”
bean的自动装配
- 自动装配时spring满足bean依赖的一种方式
- spring会在上下文自动寻找,并自动给bean装配属性
3中装配的方式
- xml显示的配置
- java中显示配置
- 隐式的自动装配bean
buName自动装配
byType自动装配
- byname的时候,需要保证所有bean的id唯一,并且这个bean需要和自动注入的属性的set方法的值一致
- bytype的时候,需要保证所有bean的class唯一,并且这个bean需要和自动注入的属性的类型一致
使用注解实现自动装配(重要!)
jdk1.5支持注解
使用注解须知:
- 导入约束
- 配置注解的支持 context:annotation-config/
<?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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"><context:annotation-config/></beans>
@Autowired
直接在属性上使用,也可以在set上使用
使用autowired可以不用编写set方法,前提是这个专配的属性在ioc容器中存在
科普:
@nullable 字段标记了这个注解,说明这个字段未null
如果@Autowired自动装配的环境比较复杂,无法通过一个注解完成,可以用@Qualifier(value=”“)指定唯一的bean对象注入
@Resource
@resource(name=”“)
小结:
@autowired和@resource的区别
都是用来自动装配的,都可以放在属性字段上
@atowired通过bytype的方式实现,必须要求这个对象存在
@resource默认通过byname实现,如果找不到名字,通过bytype,如果都找不到,报错
执行顺序:@resource先找名字,@autowired bytype
使用注解开发
spring
使用注解开发,要保证aop的包导入
使用注解需要导入context约束,增加注解支持
- bean
@Component 组件,放在类上,说明这个类被spring管理了,就是bean
- 属性如何注入
@value
@Component
public class User {@Value("荣荣")public String name;}
- 衍生的注解
@Component有几个衍生注解,我们在web开发中会按照mvc三层架构分层
dao(@Repository)
service(@Service)
Controller(@Controller)
注解功能一样,将类注册到spring容器中,装配bean
- 自动装配
@Autowired
@Resource
- 作用域
@Scope
- 小结
xml和注解
-
xml更加万能,适用于任何场合,维护简易方便
-
注解:不是自己类使用不了,维护相对复杂
最佳实践
-
xml用来管理bean
-
注解只负责完成属性的注入
-
我们在使用过程中,只需要注意一个问题,必须让注解生息哦啊,需要开启注解的支持
-
<context:annotation-config/> <context:component-scan base-package="com.rongrong.pojo"/>
-
9.使用java的方式配置spring
完全不适用spring的xml配置,全给java做
javaconfig是spring的子项目
@Configuration
配置类
@Configuration
public class RongConfig {
@Beanpublic User getUser() {
return new User();}
}
@Component
public class User {private String name;public String getName() {return name;}@Value("rongrong")public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +'}';}
}