官网:https://spring.io/projects/spring-framework
官网下载:https://repo.spring.io/release/org/springframework/spring/
GitHub:https://github.com/spring-projects/spring-framework/releases
官网核心:https://docs.spring.io/spring/docs/5.2.6.RELEASE/spring-framework-reference/core.html#spring-core
Maven:
org.springframework
spring-webmvc
5.2.6.RELEASE
org.springframework
spring-jdbc
5.2.6.RELEASE
总结一句话:Spring就是一个轻量级的控制反转(IOC),和面向切面编程(AOP)的框架
Spring官网:现代化的开发就是基于java的开发
因为现在大多数公司都在使用SprigBoot进行快速开发,学习SpringBoot的前提,需要完全掌握Spring以及
SpringMVC!
弊端:Spring发展太久,违背了原来的理念!配置十分繁琐,人称“配置地狱”!
1、UserDao接口
public interface UserDao {
void getUser();
}
2、UserDaoImpl实现类
public class UserDaoImpl implements UserDao {
public void getUser() {
System.out.println("默认获取用户的数据");
}
}
3、UserService接口
public interface UserService {
void getUser();
}
4、UserServiceImpl业务实现类
public class UserServiceImpl implements UserService {
private UserDao userDao ;
//利用Set接口进行动态实现注入
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void getUser() {
userDao.getUser();
}
}
在之前的业务中,用户的额需求可能会影响到我们原来的代码,我们需要根据用户的需求去修改源代码!如果程序代码量十分大,修改一次的成本代价十分昂贵!
我们使用一个Set接口实现,已经发生了革命性的改变!
//利用Set接口进行动态实现注入
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
这种思想,从本质上解决了问题,我们程序员不用再去管理对象的创建了。系统的耦合性大大降低,可以更加专注于在业务的实现上!这是IOC的原型!
IOC本质
控制反转IoC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IoC的一种方法,也有人认为DI只是IoC的另一种说法。没有IoC的程序中 , 我们使用面向对象编程 , 对象的创建与对象间的依赖关系完全硬编码在程序中,对象的创建由程序自己控制,控制反转后将对象的创建转移给第三方,个人认为所谓控制反转就是:获得依赖对象的方式反转了。
采用XML方式配置Bean的时候,Bean的定义信息是和实现分离的,而采用注解的方式可以把两者合为一体,Bean的定义信息直接以注解的形式定义在实现类中,从而达到了零配置的目的。
控制反转是一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。在Spring中实现控制反转的是IoC容器,其实现方法是依赖注入(Dependency Injection,DI)
1、导人Spring Maven依赖
org.springframework
spring-webmvc
5.2.6.RELEASE
2、编写Hello实体类
public class Hello {
private String str;
public String getStr() {
return str;
}
public void setStr(String str) {
this.str = str;
}
@Override
public String toString() {
return "Hello{" +
"str='" + str + '\'' +
'}';
}
}
3、编写我们的Spring文件,命名为beans.xml
4、测试
public class MyTest {
public static void main(String[] args) {
//获取Spring的上下文对象
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
//我们的对象现在都在Spring容器中了,直接通过context去获取就可以获取实例化对象
Hello hello = (Hello) context.getBean("hello");
System.out.println(hello);
}
}
思考问题?
这个过程就叫控制反转
控制:谁来控制对象的创建,传统应用程序的对象是由程序本身来控制创建的,使用Spring后,对象是由Spring来创建的
反转:程序本身不创建对象,而是变成被动的接收对象
依赖注入:就是利用set方法实现注入的
IOC是一种编程思想,由主动的编程变成被动的接收
可以通过new ClassPathXmlApplicationContext去浏览以下底层源码
OK,到了现在,我们彻底不再需要程序中去改动了,要实现不同的操作,只需要在xml配置文件中进行修改,所谓的IOC,一句话搞定:对象由Spring来创建、管理、装配!
1.使用无参构造创建对象,默认
2.使用有参构造创建对象
使用别名也可以获取对象
一般用于团队开发使用,它可以将多个配置文件导入合并为一个
假设现在项目中由多个人开发,张三,李四,王五,这三个人复制不同的类开发,不同的类需要注册在不同的bean中,我们可以利用Import将所有人的beans.xml文件合并为一个总的applicationContext.xml
使用的时候,就直接使用总的配置文件即可
前边已经说过
【环境搭建】
public class Address {
private String address;
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
public class Student {
private String name;
private Address address;
private String[] books;
private List hobbys;
private Map card;
private Set games;
private Properties info;
private String wife;
}
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("beans1.xml");
Student student = (Student) context.getBean("student");
System.out.println(student.getName());
}
西游记
红楼梦
三国演义
水浒传
听歌
写代码
看电影
DNF
CF
LOL
123456
男
小明
小明
测试
@Test
public void test(){
ApplicationContext context = new ClassPathXmlApplicationContext("user.xml");
User user = context.getBean("user",User.class);
System.out.println(user.toString());
}
注意点:使用p命名或者c命名空间注入,需要导入依赖
xmlns:p="http://www.springframework.org/schema/p"
xmlns:c="http://www.springframework.org/schema/c"
6.4Bean的作用域
1、单例模式:(Spring默认机制)
2、原型模式:每次从容器中get的时候,都会产生一个新对象!
3、其余的request、session、application这些只能在web开发中才会用到
在Spring中有三张自动装配方式
环境搭建:一个人有两个宠物!
小结:
jdk1.5开始支持注解,Spring2.5开始支持注解
要使用注解须知:
@Autowired
直接在属性上使用即可,也可以在set方式上使用
使用@Autowired我们可以不用编写set方法了,前提式你这个自动装配的属性在IOC(Spring)容器中存在,且符合名字byname!
科普:
@Nullable 字段标记了这个注解,说明这个字段可以为NULL
public @interface Autowired {
boolean required() default true;
}
@Autowired(required=false)如果显示的定义了required=false,则表示这个对象可以为null,否则不允许为空
public class People {
@Autowired(required = false)
private Dog dog;
@Autowired
private Cat cat;
private String name;
}
如果@Autowired自动装配无法通过一个注解完成的时候,我们可以使用@Qualifier(value = "XXX")去配置@Autowired注解,给其指定一个唯一的Bean
public class People {
@Autowired(required = false)
private Dog dog;
@Autowired
@Qualifier(value = "cat1")
private Cat cat;
private String name;
public Dog getDog() {
return dog;
}
public Cat getCat() {
return cat;
}
}
@Resource注解
public class People {
@Resource
private Dog dog;
@Resource(name = "cat1")
private Cat cat;
private String name;
}
@Resource和@Autowired的区别:
都是用来进行自动装配的,都可以放在属性字段上
在Spring4之后的开发,要使用注解开发,必须要导入aop的包
使用注解需要导入context的约束,增加注解的支持!
1、bean
2、属性如何注入
//等价于
@Component
public class User {
//
@Value("value")
public String name ;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
3、衍生的注解
4、自动装配
@Autowired:自动装配通过类型—->名字 如果@Autowired不能唯一自动装配主属性,则需要通过@Qualifier(value = "XXX") @Resource:自动装配通过名字-->类型 @Nullable 字段标记了这个注解,说明这个字段可以为NULL @Component组件:放在类上,说明这个类被Spring管理了,就是bean!
@Component
@Scope("singleton")
public class User {
//
@Value("value")
public String name ;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
6、小结
xml与注解
最佳实践:
我们现在完全不使用Spring的xml配置了,全权交给java来做
javaConfig是Spring的一个子项目,在Spring4之后,它成为了一个核心功能
实体类
//这个注解说明这个类被spring管理了,注册到了容器中
@Component
public class User {
private String name;
public String getName() {
return name;
}
@Value("wxb")//注入值
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
'}';
}
}
配置类
//@Configuration这个类也会被spring管理,注册到容器中,因为Configuration本来就是一个@Component
//@Configuration代表这是一个配置类,就和我们之前的beans.xml一样
@Configuration
@ComponentScan("com.aostarit.pojo")
@Import(UserConfig.class)
public class BeanConfig {
//注册一个bean:就相当于我们之前写的一个bean标签
//这个方法的名字,就相当于bean标签的id属性
//这个方法的返回值类型,就相当于bean标签中的class属性
@Bean
public User getUser(){
return new User();
}
}
测试类
public class MyTest {
public static void main(String[] args) {
//如果完全使用了配置类去做,我们就只能通过AnnocationConfig上下文来获取容器,通过配置的class对象加载!
ApplicationContext context = new AnnotationConfigApplicationContext(BeanConfig.class);
User user = (User) context.getBean("getUser");
System.out.println(user.getName());
}
}
这种纯Java在SpringBoot中随处可见