目录
spring概述
什么是spring
Spring是Java EE编程领域的一个轻量级开源框架,该框架由一个叫Rod Johnson的程序员在 2002 年最早提出并随后创建,是为了解决企业级编程开发中的复杂性,实现敏捷开发的应用型框架 。致力于java EE 应用各层的解决方案 。
spring框架的优点
- 非侵入式设计
- 方便解耦、简化开发
- 支持AOP]
- 支持声明式事务处理
- 方便程序的测试
- 方便集成各种优秀框架
- 降低javaEEAPI的开发难度
spring的体系结构
Spring框架采用的是分层结构,他的一系列功能要素备份为20各模块,如图所示
Core Container---核心容器
Data Accree/Integraion---数据访问/集成
web--- text---测试
Spring快速入门小程序
1.maven方式建立项目导入坐标
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
</dependencies>
2.创建Bean
3.创建applicationContext.xml
创建方式---新建xml---spring,文件内容自动形成
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 http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--为文件添加以下一句话,id随便,class填写bean类的全类名-->
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"></bean>
</beans>
5.创建ApplicationContext对象getBean
public class UserDaoDemo {
public static void main(String[] args) {
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
// UserDao userDao = (UserDao) app.getBean("userDao");
UserDao userDao = (UserDao) app.getBean("userDao");
userDao.save();
}
}
6.测试运行结果如下
Spring配置文件详解
1.Bean标签基本配置
配置对象可有spring创建,默认情况下调用类中无参构造函数,没有无参构造函数则创建失败
bean标签的作用域
singleton(单例):无论通过多少getBean获取的对象示例实际对象只有一个,
prototype(原型):每次通过getBean方法可获取对象示例时都会创建一个新的Bean实例
其他作用域----request---session---globalSession--websocket--application,具体见书籍
2.Bean的生命周期
singleton,创建时机Spring核心文件被加载时,实例化配置的Bean实例,只要容器存在,对象便一直存活,应用卸载,销毁容器时对象被销毁,
prototype:调用getBean()方法时实例化Bean,对象在使用时存活,长时间不使用,被Java的回收器回收
配置生命周期(了解)
标签内使用 init-method=""配置初始化后执行的方法,destroy-method=""配置销毁后执行的方法
bean的三种实例化方式
无参构造方法实例化
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"></bean>
工厂静态方法实例化----factory-method指向工厂类中的创建的对象的方法
<bean id="StaticFactoryUserDao" class="com.itheima.factory.Factory" factory-method="creatBean"/>
工厂实例方法实例化-----factory-bean指向工厂类,使用前要先配置一个工厂类的bean,可以调用无参构造方法
<bean id="factory" class="com.itheima.factory.Factory"></bean>
<bean id="DynamicFactory" factory-bean="factory" factory-method="creatBean1"></bean>
工厂类的内容
public class Factory {
public static UserDaoImpl creatBean() {
return new UserDaoImpl();
}
public UserDaoImpl creatBean1() {
return new UserDaoImpl();
}
}
Spring依赖注入详解
依赖注入概念
依赖注入是指在程序运行过程中,如果需要调用另一个对象协助,无需在代码中创建被调用者,而是依赖外部的注入,具体含义是:当某个角色(可能是一个Java实例,调用者)需要另一个角色(另一个Java实例,被调用者)的协助时,在 传统的程序设计过程中,通常由调用者来创建被调用者的实例。但在Spring里,创建被调用者的工作不再由调用者来完成,创建被调用者 实例的工作通常由Spring容器来完成,然后注入调用者,因此也称为依赖注入。
简单来说就是使用业务层Service对象时不用在创建一个持久层Dao对象,以为Dao对象的实例化工作已经由Spring完成了,我们只需Service对象里调用就可以了,减少代码的工作量以及耦合性,重构的之后代码的改写量将大量减少(定义来源于网络以及个人理解)
实现注入的方式
1.set方法注入
<!--set注入方式-->
<bean id="setService" class="com.itheima.service.impl.UserServiceImpl">
<property name="userDao" ref="userDao"></property><!--name指get方法内部参数名,ref指容器内id-->
</bean>
<!--set的p命名空间注入,前提前面加入xmlns:p="http://www.springframework.org/schema/p"-->
<bean id="setService_p" class="com.itheima.service.impl.UserServiceImpl" p:userDao-ref="userDao"></bean>
2.构造方法注入
<!--构造器注入方式-->
<bean id="constructorService" class="com.itheima.service.impl.UserServiceImpl">
<constructor-arg name="userDao" ref="userDao"></constructor-arg><!--name指构造方法内部参数名,ref指容器内id-->
</bean>
3.其他数据类型注入
<!--以上为引用类型的注入的注入-->
<!--以下为基本类型的注入-->
<bean id="setService1" class="com.itheima.service.impl.UserServiceImpl">
<property name="userName" value="userName"></property><!--name指get方法内部参数名,ref指容器内id-->
</bean>
<!--集合的注入-->
<bean id="setService1" class="com.itheima.service.impl.UserServiceImpl">
<property name="list" >
<value>aaa</value>
<value>bbb</value>
</property><!--name指get方法内部参数名,ref指容器内id-->
</bean>
<bean id="setService1" class="com.itheima.service.impl.UserServiceImpl">
<property name="map" >
<map>
<entry value-ref="userDao" key="userDao1"></entry><!--entry键值对这里引入了一个对象的值-->
</map>
</property><!--name指get方法内部参数名,ref指容器内id-->
<!--properties注入方式-->
<property name="properties">
<props>
<prop key="p1" >ppp</prop>
<prop key="p2" >ppp</prop>
<prop key="p3" >ppp</prop>
</props>
</property>
</bean>
4注解方式注入
原始注解表
注入测试
@Component("userService1")
@Scope("singleton")
public class UserServiceDemo implements UserService {
@Resource(name = "userDao1")
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Value("${jdbc.driver}")//根据引入的配置文件中的key注入值
private String driver;
@Override
public void save() {
userDao.save();
System.out.println(driver);
}
public static void main(String[] args) throws SQLException {
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService bean = (UserService) app.getBean("userService1");
bean.save();
}
}
这仅仅是注解的初级使用,在Spring5更新新注解后完全可以使用注解代替配置文件来使用,详细见我后续学习文章
5引入其他配置文件
<import resource="applicataionContext-user.xml"/>
spring相关API的解释
App的三种实例化方式,即ApplicationContext的三个常用子类,以及getbean的俩种传参形式
ApplicationContext applicationContext = new FileSystemXmlApplicationContext("类根路径下加载文件"); ApplicationContext applicationContext1 = new ClassPathXmlApplicationContext("磁盘路径(绝对路径)下加载文件"); ApplicationContext applicationContext2 = new AnnotationConfigApplicationContext("使用注解配置容器对象时使用这个"); /*一般使用ClasspathXmlApplicationContext*/ applicationContext2.getBean("填写唯一ID"); applicationContext.getBean("填写UserService.class,使用于配置文件中只有相对应文件只有一种bean实例化方式时,注意现在不适用字符串参数");
ApplicationContext applicationContext = new FileSystemXmlApplicationContext("类根路径下加载文件");
ApplicationContext applicationContext1 = new ClassPathXmlApplicationContext("磁盘路径(绝对路径)下加载文件");
ApplicationContext applicationContext2 = new AnnotationConfigApplicationContext("使用注解配置容器对象时使用这个");
/*一般使用ClasspathXmlApplicationContext*/
applicationContext2.getBean("填写唯一ID");
applicationContext.getBean("填写UserService.class,使用于配置文件中只有相对应文件只有一种bean实例化方式时,注意现在不适用字符串参数");
博客声明
本博客阅读书籍为黑马程序员编写的java EE 企业级应用开发教程
配套视频为b站黑马程序员在2021-03-10发布的
仅仅作为学习笔记期末复习以及ssm框架实战使用