一、初识Spring
Spring介绍
(1)对比以往项目,Spring优势有哪些:方便解耦,简化开发;AOP切面编程;声明式事务;整合各种优秀的框架;
(2)发明者:Rod Johnson(罗宾·约翰逊 )—Java世界的传奇大师,神级人物;Spring FrameWork的缔造者;旷世奇书“葵花宝典”《Expert one on one J2EE Design and Development》作者;Servlet2.4和JDO2.0的规范专家;Java Development Community杰出人物。
(3)不重复造轮子;
(4)使用Spring所需jar包
(5)Spring官网:
Spring | HomeLevel up your Java code and explore what Spring can do for you.https://spring.io/1.2 Spring的模块
二、Spring IOC/DI
Spring IOC/DI介绍
IOC(Inversion of Control)中文名称:控制反转,也被称为)DI(dependency injection);依赖注入。注意:属于同一件事情的两个名称。
创建对象的权利,或者是控制的位置,由JAVA代码转移到spring容器,由spring的容器控制对象的创建,就是控制反转。
由于控制反转改建比较含糊,所以在2004年大师级人物Martin Fowler又给出了一个新的名字:“依赖注入”,想对于IoC而言,“依赖注入”明确描述了“被注入对象依赖IoC容器来配置依赖对象”,DI(中文名为依赖注入)是IoC的别名。
三、创建第一个Spring项目
3.1 创建项目,添加依赖
创建普通Maven项目,在项目的pom.xml中添加Spring项目的最基础依赖。
Spring项目想要运行起来必须包含:
- spring-context.jar - 它依赖了下面的四个jar
- spring-core.jar - 它依赖了spring-jcl.jar
- spring-jcl.jar
- spring-aop.jar
- spring-expression.jar
- spring-bean.jar
- spring-core.jar - 它依赖了spring-jcl.jar
所以在Maven中想要使用Spring框架只需要在项目中导入spring-context就可以了,其他的jar包根据Maven依赖传递性都可以导入进来。
pom.xml
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.9</version>
</dependency>
</dependencies>
3.2 创建一个类
3.3 创建Spring配置文件
要去Spring官网找到xml配置文件的文档头和约束部分
applicationContext.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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 构建Book对象-->
<bean id="b" class="com.spring.pojo.Book"></bean>
</beans>
3.4 创建测试类
package com.study.test;
import com.spring.pojo.Book;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
// 创建Spring容器:
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
// 获取对象
Book book = (Book)context.getBean("b");
// 打印对象的信息
System.out.println(book.getName() + " ---- " + book.getId());
}
}
四、属性注入
4.1 属性注入方式
以前不适用Spring的时候有两种属性注入方式
4.2 属性注入-设值注入
直接在applicationContext.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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 构建Book对象-->
<bean id="b" class="com.spring.pojo.Book">
<!--设值注入-->
<property name="id" value="1"></property>
<property name="name" value="小张学Java"></property>
</bean>
</beans>
4.3 属性注入-构造注入
构造注入:这里的name要和有参构造器的参数一致4.4
<?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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 构建Book对象-->
<bean id="b" class="com.spring.pojo.Book">
<!--构造注入:这里的name要和有参构造器的参数一致-->
<constructor-arg name="id" value="2"></constructor-arg>
<constructor-arg name="name" value="小张学Java"></constructor-arg>
</bean>
</beans>
4.4 属性注入-引用数据类型
(1)创建两个对象:Girl和Boy,Girl中有Boy对象以及他的getter和setter方法(模拟复杂数据类型)
(2)创建applicationContext.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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!--①先构建boy对象-->
<bean id="boy" class="com.spring.pojo.Boy">
<property name="age" value="22"></property>
<property name="name" value="小帅"></property>
</bean>
<!--②传参-->
<bean id="girl" class="com.spring.pojo.Girl">
<property name="age" value="19"></property>
<property name="name" value="露露"></property>
<property name="boyFriend" ref="boy"></property>
</bean>
</beans>
(3)创建测试类,验证传参
package com.study.test;
import com.spring.pojo.Girl;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test3 {
public static void main(String[] args) {
// 创建Spring容器:
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
// 获取对象
Girl g = (Girl)context.getBean("girl");
System.out.println("女孩名字:"+g.getName()+",女孩男朋友的名字是"+g.getBoyFriend().getName());
}
}
五、注解
5.1 什么是注解
注解其实就是代码里的特殊标记,这些标记可以在编译、类加载、运行时被读取,并执行相应的处理。通过使用注解,程序员可以在不改变原有逻辑的情况下,在源文件中嵌入一些补充详细。代码分析工具、开发工具和部署工具可以通过这些补充信息进行验证或者进行部署。
5.2 注解的使用
使用注解时要在其前面增加@符号,并把该注解当成一个修饰符使用。用于修饰他支持的程序元素(包、类、构造器、方法、成员变量、参数、局部变量的声明)。
5.3 注解的重要性
在JavaSE中,注解的使用比较简单,例如标记过时的功能,忽略警告等。在JavaEE/AeIdroid中注解占据了更重要的角色,例如用来配置应用程序的任何切面,代替JavaEE旧版中所遗留的繁冗代码和XML配置等。未来的开发模式都是基于注解的。一定程度上可以说:框架=注解+反射+设计模式。
5.4 Ioc/DI相关的注解
注解名称 | 解释 | |
---|---|---|
这几个注解的用法跟@Component用法基本一样,只是用的地方不同 | @Component | 实例化Bean,默认名称为类名首字母变小写。无需指定setter方法 |
@Repository | 作用和@Component一样,用在持久层 | |
@Service | 作用和@Component一样,用在业务层 | |
@Controller | 作用和@Component一样,用在控制器层 | |
@Configuration | 作用和@Component一样,用在配置类上 | |
@Autowired | 自动注入。默认byType,如果多个同类型bean,使用byName | |
@Value | 给普通数据类型属性赋值 |
前五个注解作用一样,之所有搞出这么多,就是在语义上进行区分,放入不同层用不同的注解(@Component可以放在任何层级),但是作用都是创建对象。
5.5 @Component的使用
(1)在要创建对象的类中加入@Component注解,对象名称默认为:类名首字母变小写
(2)注解在哪个包下?要想找到这些注解,需要奖注解所在的包进行扫描:设置需要扫描的包。并且在applicationContext.xml中添加context命名空间。
<?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/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.spring.pojo"></context:component-scan>
</beans>
(3)获取对象示例
package com.study.test;
import com.spring.pojo.Girl;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test3 {
public static void main(String[] args) {
// 创建Spring容器:
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
// 获取对象
Girl g = (Girl)context.getBean("girl");
System.out.println("女孩名字:"+g.getName()+",女孩男朋友的名字是"+g.getBoyFriend());
}
}
// 这里只是获取到了构建的对象,对象中属性的值并没有注入,所以拿到的都是默认值
5.6 通过注解给对象属性赋值
(1)@Value的使用
给普通数据类型赋值的注解,普通数据类型包括:八种基本数据类型+String
- 基本数据类型:6种数字类型(byte/short/int/long/float/double)、1种字符型(char)、1种布尔型(boolean)
(2)@Autowired的使用
添加@Autowired注解后会把容器中的对象自动注入进来,并且不需要依赖set方法。

