什么是spring
开源的框架,框架就是半成品的产品,就像我们建楼,建房一样,每一个部分组成了一个统一的结构,spring引入控制反转,简化企业开发,高复用性和移植性
控制反转
应用本身不负债依赖对象类的创建和维护,依赖对象的创建和维护是由外部容器负责的。控制权由应用移动到外部容器,也就叫依赖注入,是控制反转的重要部分,在程序运行当中动态的实现依赖注入,减少程序的耦合程度
耦合:代码书写过程中所使用技术的结合紧密度
内聚:代码书写过程中单个模块内部组成部分间的联系
重要特性
IOC 把外部想用的对象交给外部去处理,是一个容器,也就是下面写在
AOP 面向切面编程,在不改变目标原有代码的前提下新增功能,起到无嵌入解耦的功能
maven管理jar包文件
什么是maven,管理jar包,解决版本冲突的一个jar仓库
使用,网上下载apache-maven,本地配置maven仓库
中央仓库,全球性的仓库,但是速度太慢,所以我们一般在阿里巴巴的镜像云下载jar包,在conf文件夹里面的settings.xml文件找到这行,配置仓库的目录,53行的那句话拿出来改成本地路径
配置文件的路径和系统的路径的斜杠是相反的
配置阿里云的地址,网上找复制就行了152行
central
central
http://maven.aliyun.com/nexus/content/groups/public
central
创建一个maven项目
通过选择第一个红色圈的地方创建一个java项目
第二个红色圈配置的是web项目,接下来配置好组id
同理idea也要配置好maven的环境,找到maven目录下conf下的setting.xml文件配置好就行了
修改编译器依赖
maven重载
maven依赖管理网站mvnrepository,搜索spring
用这个spring web mvc,之后继续点击所选版本
最后复制这个依赖到pom.xml文件里面
找到dependencies这个标签,往里面进行复制
同样再进行重载就行了
刚才网站下载下来的jar包存在这个文件里面
创建一个resources文件
在resources文件夹下面增加applicationContext.xml配置文件模板,容器对象,创建对象保存在这里
在xml文件里面进行对象的配置
以后会在这里面配置成千上万的bean,注意这些内容要放在
package com.test;
import com.entor.entity.User;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
/**
*@describe 不使用spirng框架对象的使用
**/
User user = new User();
user.setId(1);
user.setName("zhangsan");
/**
*@describe 通过使用spring框架对象的使用
* 加载spring配置文件,并且默认创建对象
**/
ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("/applicationContext.xml");
/**
*@describe 通过xml里面的id来获取对象
**/
User user1 = (User) classPathXmlApplicationContext.getBean("user");
System.out.println(user1);
/**
*@describe 从xml里面通过反射拿到这个对象
**/
User bean = classPathXmlApplicationContext.getBean(User.class);
System.out.println(bean);
/**
*@describe 单例模式,唯一实例
**/
System.out.println(user1==bean);//true
}
}
可以通过这个属性配置其他模式
加载配置文件时不创建对象,懒加载,用的时候才创建
指定对象创建的时候初始化的方法,只会被执行一次,同样也有对象销毁的方法
执行了这个user这个实体类里面的这两个指定方法
public void init(){
System.out.println("对象创建");
}
public void destory(){
System.out.println("对象销毁");
}
嵌套实体类
循环嵌套
实体类
package com.entor.entity;
public class Bean1 {
private Bean2 bean2;
private Bean3 bean3;
public Bean1() {
}
public Bean2 getBean2() {
return bean2;
}
public void setBean1(Bean2 bean2) {
this.bean2 = bean2;
}
public Bean3 getBean3() {
return bean3;
}
public void setBean3(Bean3 bean3) {
this.bean3 = bean3;
}
@Override
public String toString() {
return "Bean1{" +
"bean1=" + bean2 +
", bean3=" + bean3 +
'}';
}
}
通过ref属性引用其他类型对象
/**
*@describe 注释在属性上面,作用,根据属性名称去配置文件中获取对应id(d属性是bean
* 唯一标识,用来获取bean类的对象,class属性是类的全限定名)名称的bean对象,找到后赋值给该属性
* 如果没有找到这会根据属性类型去文件当中找
**/
@Resource
@Resource
private Bean2 bean2;
@Resource
private Bean3 bean3;
同时还要在xml文件当中开启注解模式
通过注解配置xml
如果有多个重复的id编译器会报id是重复的错误
同样的还有另一个注释
/*
* @Autowired 注解在属性上面,作用根据属性类型去配置文件查找对象,
如果找到多个,再根据属性名称去查找,如果找不到则报错
* 配合使用@Qualifier注解使用,指定名称去查找,如果找不到则报错,
不会再根据属性名称去找
**/
@Autowired
@Qualifier("bean2")
private Bean2 bean2;
虽然设定规则去查询类,但是配置文件里面的类仍然会越来越多,不利于维护,能不能把xml当中的实体类去掉呢,可以,在实体类上面进行注解,上面这三个注解是定义查找bean的规则
/**
*@describe 此注解多用在类上,作用:相当于配置文件中一个bean标签,
相当于配置文件里面的bean标签,默认的id属性名称
* 是名该类名的首字母小写格式,也可以指定名称
**/
@Component("bean1")
加上去之后还不行,配置文件还不知道去哪找这些注解,在配置文件里面加上
/**
* @Component 标签下面三个以外的组件
*
* @Controller 标识处理客户端请求类
*
* @Service 注解标识业务处理类
*
* @Repository 标识数据访问层处理业务类
*
* 区分不同对象,前台,业务,仓管
**/
上面4种注解是创建bean的注解
如果没有通过注解的方式获取对象,那么你创建的内存空间和spring创建对象的内存空间不是相同的,那么导致你对象里面如果使用注解的方式查找对象没有被spring查找并赋值,会报空指针异常,就像链表,中间一环掉了就没有了