Spring
- 1.spring了解
- 2. Spring实现
- 2.1 添加依赖
- 2.2 Spring实现
- 2.2.1 xml配置实现
- 2.2.1.1 Bean标签属性
1.spring了解
-
spring重要性
在当前的系统中,spring的重要性and占比性高达50%,无论是在ssm、ssh等框架中,spring始终屹立在前方,所以对于一个程序员来说,spring技术是每一个程序员必备的技术。好了,那我们就开始学习spring了吧~
···········
在java程序中创建对象是必然的,只要需要对象就会去创建一个对象,但是呢创建后就没有销毁等操作了,这就意味着对象和内存就得不到更好的管理,虽然有垃圾回收机制,但是至于什么时候回收这也是jvm的事情,所以也不好判断,为了解决对象和内存的问题,spring就来的刚刚好。 -
Spring概念
spring可以看作是一个容器,容器里面装了很多的对象(bean)并且维护起来,要使用对象的时候,直接在容器里面取就可以了 -
Spring作用
Spring最主要的作用就是管理的对象的完整生命周期(对象的创建、使用、销毁等)包括对象之间的依赖关系给,spring都可以去管理
2. Spring实现
2.1 添加依赖
在maven项目中,要使用某一个框架呀啥的都是需要去导入对应的jar包的
依赖:
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.18</version>
</dependency>
2.2 Spring实现
2.2.1 xml配置实现
当然哈,在使用配置文件进行操作的时候,实体类吖、dao层啊、service层的代码的连接自己要写好哟,spring的实现都是在这些基础上的哈。
- xml配置文件:
第一种实现方式xml配置实现,既然是用xml配置文件实现,那就要去配置一下spring的xml文件了,在spring中的xml配置文件一般是用ApplicationContext.xml来命名存放的(记得是放在resource里面哟~)
<?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">
<!--先放在这里,先去完成controller、serviceImpl里面的对象创建再来填补这里代码-->
注意:每一个xml配置文件,包括mybatis的config.xml吖、mapper.xml啊这些的xml文件,都会是有一个头的,这个头相当于就是告诉我们的编译器,这个xml文件是一个什么类型的xml文件
- 改变对象的创建方式
以前使用方式:创建PetController的对象去调用service对象,service对象再去调用dao对象去完成,但是这样的话就很不方便,每一次要用对象的时候都要去new一个来用
private PetService petService = new PetServiceImpl();
spring方法:将对象都真装在容器里面,这样的话每一次要用直接调用set方法就行。这样的话不管什么时候想用都可以,所以就将controller和serviceImpl中的对象创建方式换一下:
- 配置xml完整
所有类都创建好后,就可以通过去配置xml文件,去反射出相应的对象,然后又因为ref的连接,所有对象又可以按照controller调用service调用dao去连接有了关系
<?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),每一个bean就是每一个对象,根据id去判断具体是那个类、接口的对象,然后通过反射就会去创建对应id的对象-->
<bean id="petDao" class="com.xiaowang.dao.impl.PetDaoImpl">
<!-- 获取dao层的对象,完成对数据库信息的管理-->
</bean>
<bean id="petService" class="com.xiaowang.service.impl.PetServiceImpl">
<!-- 获取service层的对象,去调用dao层内对象,所以需要去与dao层进行关联-->
<!-- property标签内的name就是跟对象创建set的方法后面的方法名,也就是方法名去掉set的部分,
比如:setPetDao——>petDao setPetService——>petService
然后ref里面的就是要连接容器中对象的id,-->
<property name="petDao" ref="petDao"/>
</bean>
<bean id="petController" class="com.xiaowang.controller.PetController">
<property name="petService" ref="petService"/>
</bean>
<!-- 相当于现在就在容器中放了三个对象了,三个对象的关系也由ref给连接起来了-->
</beans>
- 测试spring的代码
package com.xiaowang;
import static org.junit.Assert.assertTrue;
import com.xiaowang.controller.PetController;
import com.xiaowang.entity.Pet;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* Unit test for simple App.
*/
public class AppTest
{
/**
* Rigorous Test :-)
*/
@Test
public void shouldAnswerWithTrue()
{
//创建容器对象,容器就是刚刚配置的xml文件
ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("ApplicationContext.xml");
//从容器中获取对象
//getBean里面的name就是xml文件里面controller的id,根据这个id和后面的类类型,这样就可以拿到容器里面对应的对象
PetController petController = classPathXmlApplicationContext.getBean("petController", PetController.class);
//因为在xml配置文件中,controller、service、dao的对象关系已经连接了,所以也不用自己去实例化了
Pet xiaowang = petController.add("xiaowang", "123456");
System.out.println(xiaowang);
}
}
结果:
2.2.1.1 Bean标签属性
id 表示bean在容器中的唯一标识 一般是类名首字母小写 如果没有写 默认值为 全路径#第几个 com.zlt.controller.UserController#0
class 类的全路径
init-method 初始化方法 对象创建后会被调用一次
destroy-method 销毁方法 容器销毁之前会被调用一次
scope="singleton" 作用范围
singleton 单例模式 默认值
prototype 工厂模式 设置为工厂模式的时候销毁方法不会执行
如果是在web项目中 request 请求作用域 session 会话作用域 globalSession 全局作用域
autowire 自动装配
byType 默认从容器中寻找对应的类型的bean注入进去 如果匹配到多个就会不知道注入谁进去
byName 根据id和属性名进行自动注入
constructor 通过构造来进行注入
no 和 default 都相当于不自动注入
lazy-init 懒加载 设置为true的时候容器创建时不会去初始化对象 默认false