Spring知识点
1、Spring
解决企业应用开发的复杂性
-
interface21
-
2002年推出Spring雏形interface21
-
2004年3月24日
-
Rod johnson
-
不要重复的造轮子
理念 :使先有的技术更容易,整合和现有的技术框架
SSH:Struct2+Spring+Hibernate
SSM:SpringMvc +Spring +Mybatis
下载地址
github:https://github.com/spring-projects/spring-framework
jar包 Spring-Jdbc+Spring Mvc
1.2、优点:
- Spring是一个开源的免费(框架)容器
- Spring是一个轻量级的、非非入侵使的框架
- 支持事务的支持
- 控制反转(IOC) 面向切面百编程
Spring就是一个轻量级的控制反转(IOC)和面相切面编程(AOP)的框架。
1.3、组成
1.4、拓展
-
Spring-Boot
- 快速开发脚手架
- 基于Spring-Boot可以快速开发是单个微服务
-
Spring-Cloud
- Spring-Cloud基于Spring-Boot实现的
学习Spring-Boot的前提是掌握Spring-Mvc及Spring
弊端:发展时间长。配置繁琐
2、IOC理论推倒
-
UserDao
-
USerDaoImpl
-
UserService
-
UserServiceImpl
//方法赋值
TestDaoImpl dao;
public void setDao(TestDaoImpl dao) {
this.dao = dao;
}
3、hello Spring
4、IOC创建对象
默认通过调用无参构造创建对象(无参构造创建对象)
实体类
package com.cxp.pojo;
import java.security.PrivateKey;
@Override
public String toString() {
return "User{}";
}
public User(String name, Integer id) {
System.out.println("有参构造");
this.name = name;
this.id = id;
}
public User() {
System.out.println("无参构造"); }
get和set方法......
bean.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 http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--IOC创建对象-->
<bean id="user" class="com.cxp.pojo.User">
<property name="name" value="张三" />
</bean>
</beans>
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("bean.xml");
User user = (User) applicationContext.getBean("user");
输出结果
无参构造
通过有参构造器创建对象
-
通过下标
<constructor-arg index=<bean id="user1" class="com.cxp.pojo.User"> <constructor-arg index="0" value="李四"/> <constructor-arg index="1" value="1"/> </bean> -
通过数据类型创建(不推荐)
<constructor-arg type="java.lang.String" value="wangwu" /> -
直接通过参数来设置
<constructor-arg name="name" value="张三" />(常用)
总结:Spring在加载是已经实例化了用的时候直接实例化
5、Spring配置
5.1、别名 alias
<alias name="user3" alias="1234556" />
5.2、bean配置(重点)
<bean id="user4" class="com.cxp.pojo.User" name="cxp;1 2" >
<constructor-arg name="name" value="张三" />
<constructor-arg name="id" value="1" />
</bean>
5.3、import(导入合并多个配置文件)
<?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 http://www.springframework.org/schema/beans/spring-beans.xsd">
<import resource="bean.xml" />
</beans>
6、DI(依赖注入)
6.1、构造器输入(4)
6.2、set注入
-
依赖注入:set注入
- 依赖:bean对象的创建依赖于容器
- 注入:bean对象的所有属性,由容器来注入
【环境搭建】
- 复杂环境
实体类
private User user; private Map<String ,String> map; private String[] str; private List<String> list; private List<Map<String ,Object>> mapList; get和set方法......<?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 http://www.springframework.org/schema/beans/spring-beans.xsd"> <import resource="bean.xml" /> <bean id="user" class="com.cxp.pojo.User"> <!--给user对象复制 --> </bean> <bean id="student" class="com.cxp.pojo.Student"> <!-- bean注入--> <property name="user" ref="user" /> <!--给String[] 属组注入--> <property name="str"> <array> <value>张三</value> <value>李四</value> <value>wangwu</value> </array> </property> <!--list数组注入--> <property name="list" > <list> <value>听歌</value> <value>吃饭</value> <value>看书</value> <value>去玩</value> </list> </property> <!--map集合赋值--> <property name="map"> <map> <entry key="1" value="4" /> <entry key="2" value="5" /> <entry key="3" value="6" /> </map> </property> <!--list<map> 赋值--> <property name="mapList" > <list> <map> <entry key="name" value="张三" /> <entry key="id" value="1" /> <entry key="age" value="12" /> </map> <map> <entry key="name" value="李四" /> <entry key="id" value="1" /> <entry key="age" value="12" /> </map> <map> <entry key="name" value="王五" /> <entry key="id" value="1" /> <entry key="age" value="12" /> </map> </list> </property> <!--给set赋值--> <property name="games"> <set> <value>lol</value> <value>cf</value> </set> </property> <!--给自定义类型赋值--> <property name="info"> <props> <prop key="DRIVER">jdbc</prop> <prop key="URL">127.0.0.1</prop> <prop key="USERNAME">root</prop> </props> </property> <!--给null赋值--> <property name="wife"> <null/> </property> </bean> </beans>输出结果
Student{user=User{name='null', id=null}, map={1=4, 2=5, 3=6}, str=[张三, 李四, wangwu], list=[听歌, 吃饭, 看书, 去玩], mapList=[{name=张三, id=1, age=12}, {name=李四, id=1, age=12}, {name=王五, id=1, age=12}], games=[lol, cf], info={URL=127.0.0.1, DRIVER=jdbc, USERNAME=root}, wife='null'}- 真实测试环境
6.3、第三方拓展注入
-
命名空间赋值
- C:命名(对应构造器注入)
- P:命名(对应set注入 )
注意:p命名和c命名赋值方法不能直接用要先配置xml配置
6.4、bean的作用域
-
singleton:单例模式(重点掌握)
- 默认为单例可以显示设置
-
prototype:原型模式(重点掌握)
- 每一次从容器中get的时候都是一个行新对象
-
request 、session 、application、websocket:
6.5、监听
7、Bean的自动装配
- 自动装配是Spring满足bean依赖的一种方式
- Spring会在上下文自动寻找,并给Bean装配属性
Spring中有三种装配方式
- 在Xml显示配置
- 在Java中显示配置
- 隐式的自动装配Bean(重要)
7.1、测试
环境搭建
实体类
public class Dog {
public void cry(){
System.out.println("汪汪汪");
}
}
public class Cat {
public void cry(){
System.out.println("喵喵喵");
}
}
public class People {
Cat cat;
public Cat getCat() {
return cat;
}
public void setCat(Cat cat) {
this.cat = cat;
}
public Dog getDog() {
return dog;
}
public void setDog(Dog dog) {
this.dog = dog;
}
Dog dog;
<?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 http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="cat" class="com.cxp.pojo.Cat" />
<bean id="dog" class="com.cxp.pojo.Dog" />
<bean id="people" class="com.cxp.pojo.People">
<property name="cat" ref="cat"/>
<property name="dog" ref="dog"/>
</bean>
</beans>
测试
public class MyTest {
public static void main(String[] args) {
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("bean.xml");
People people = applicationContext.getBean("people",People.class);
people.getCat().cry();
people.getDog().cry();
}
}
结果
喵喵喵
汪汪汪
7.2、自动装配(autowire)
- byName
- ByType
<bean id="people" class="com.cxp.pojo.People" autowire="byName">
</bean>
class="com.cxp.pojo.People" autowire="ByType">
</bean>
7.3、注解装配
@AutoWired
可以省略Set方法
jdk1.5开始注解
Spring 2.5开始注解
使用注解须知
- 导入约束
- 指定要扫描的包
<context:component-scan base-package=""/>配置注解的支持<context:annotation-config/>
<context:component-scan base-package="com.cxp"/>
<bean id="cat" class="com.cxp.pojo.Cat" />
<bean id="dog" class="com.cxp.pojo.Dog" />
<bean id="people" class="com.cxp.pojo.People" autowire="byName"/>
科普
@Autowired()
@Nullable 字段标记了这个注解 说明这个字段可以为Null
如果@Autowired自动装配面对复杂的装配环境,自动装配无法通过一个注解@Autowired完成的时候可以用@Qualifler(value="xxx")去配置@Autoeired的使用指定一个唯一的bean的对象注入
java的原生注解 @Resource
小结:@autowirde和 @Resource的区别
- 都是用来自动装配的,都可以放在属性字段上
@autowirde通过byType的方式实现,而且必须存在这个对象(常用)@Resource默认通过ByName的方式实现,如果找不到名字,则通过ByType的方式实现!如果两个都找不到的情况就报错- 执行顺序不同:
@autowirde通过BytType方式实现@Resource默认通过ByName方式实现
8、使用注解开发
- 添加注解支持
@Componet 组件放在类上说明 @value 赋值
衍生注解
- dao【@Repository】
- service【@Service】
- controller【@Controller】
这四个注解的功能都是一样的
@scope
小结
xml与注解
- xml更万能,适用于各种场合!维护简单
- 注解不是自己的类就不能用,维护相对复杂
xml于注解的最佳实践
- xml用来管理bean
- 注解只负责完成属性注入
9、新特性 使用Java的方式配置Spring
纯Java的注解字在SpringBoot中非常常见

浙公网安备 33010602011771号