Spring框架
- 框架作用
指的是实现软件开发的基础软件产品,不同框架在软件开发的各个模块中起到到简化开发作用。列如:spring负责解耦,struts2,mvc层分离,hibernate负责持久化。
学习的目的:简化开发
- spring框架介绍
Spring是最受欢迎的企业级java应用开发框架,数以百万的来自世界的开发人员使用spring框架来创建性能好,易于测试,可重用的代码。Spring框架是一个开源的Java平台,最初是由rod Johnson编写,spring是轻量级的框架,spring框架的核心特性是可以用于开发任何的Java应用程序,但在Java EE平台构建web应用程序是需要扩展的,spring框架的目的是java EE开发更加容易,通过启用pojo编程模型来促进良好的编程实践。
- spring的体系结构
Spring最核心的是IOC容器和AOP编程,其他模块是可选模块,且是在IOC容器基础之上的。Spring为企业提供一站式服务。
- 为什么使用spring
Spring IOC容器可以实现代码的解耦,基本思路就是实现一个功能强大的BeanFactory工厂,同时可以缓存各种bean对象,需要某个特定的bean从实例从IOC中获取
Java POJO Classes
z
JavaBean:javaEE下的一个技术规范
JavaBean:泛指一切java类型DaoImpl ServiceImpl (或叫组件)
IOC容器:控制反转,指当前类交出控制权,交给容器,我们需要某个对象通过容器获得,而不是自己创建
- 如何获取spring框架
获得代码:http://repo.spring.io/release/org/springframework/spring/版本: 最新的版本 5.1.4.RELEASE
xxx-dist 包含所需的jar包和源
6.安装spring for Eclipse插件
安装插件的目的,获取更多的模板和提示
7.spring入门案例
使用spring IOC容器
- 创建工程
- 导入相关jar包
注意:添加到编译路劲
- 编写POJO类
package com.bjlemon.pojo;
public class Student {
public void sayHello() {
System.out.println("大家好,我是张家辉");
}
}
- 编写spring的配置文件
<?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">
<!-- 注册一个<u>Studnet</u>对象到IOC容器中
id: 对象名
class: 指定对象的类型 ,取值为类全名,作用是框架根据类全名进行反射 创建对象
相当于:Student st = new Student()
-->
<bean id="st" class="com.bjlemon.pojo.Student" > </bean>
</beans>
- 测试
package test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.bjlemon.pojo.Student;
Public class springTest{
Public static void main(string[] args){
//原始方式
//student st= new student();
//spring反式
- 创建IOC容器
ApplicationContext ioc = new ClassPathXmlApplicationContext(“application.xml”);
Student st = (student) ioc.getBean(“st”);
}
}
- 创建Bean的方式
JavaBean:是JavaEE的一个技术规范,是企业应用中组件抽象,通常实体类pojo,业务层,持久层,工具。都称为JavaBean。
Spring框架就是来管理各种各样的bean,spring IOC容器来管理bean的实现
Spring的创建方式:
- 基于构造器创建
构造器创建
< bean name=”dl” class=”com.bjlemon.pojo.Dog”/>
底层:
String className=“com.bjlemon.pojo.Dog”;
Class class=Class.forName(className);
Object d=class.newInstance();
- 静态工厂方法创建
<bean name=”d2,d3” class=”om.bjlemon.pojo.DogFactory” factory-method=”getDog”/>
- 工厂实例方法 创建
- 创建工厂
<bean name=”factory” class=”om.bjlemon.pojo.DogFactory”/>
- 调用工厂方法
<bean name=”d4” factory-bean=”factory” factory-method=”getDogInstance”/>
- Bean的生命周期
Bean的生命周期,指的是bean创建,初始化,销毁的各个阶段。
如何获取生命周期中的各个阶段,需要对生命周期进行监听
- 创建,通过构造器可获得。
- 初始化,init-method=“自己的监听方法”。
- 销毁,destroy-method=“自己的监听方法’
<bean name=”mydog” class=”om.bjlemon.pojo.Dog” init-method=”init” destory-method=”destory”/>
全局配置:
<bean default-init-method=”init” destoty-method=”destory”/>
- Bean作用域
作业域指bean的有效范围
<bean name=”dog” class=”om.bjlemon.pojo.Dog” scope=”prototype”/>
scope的取值:
- prototype:原型模式,每一次都创建一个新的。
- Singleton:单列模式:第一次创建,然后被缓存,以后都返回这一个相同的对象。
- Request
- Session
Scope默认singleton
- Bean的懒加载
懒加载也叫延迟加载,只有使用时才去加载
<bean name=”dog” class=”om.bjlemon.pojo.Dog” scope=”singleton” lazy-init=”true”/>
lazy-init的取值:
True:表示启动懒加载
False:表示不要懒加载
Default:默认是false
全局配置<bean ...default-lazy-init=”true”/>
- 依赖注入
- Set注入:调用set方法注入
<bean name="p1" class="com.bjlemon.pojo.Person">
<!-- 为属性赋值 -->
<property name="name" value="王思聪">
</property>
<property name="age">
<value>40</value>
</property>
<property name="car" ref="myCar"/>
<!--
说明: name 属性名字,但是底层会根据属性名推测 set方法,推测原理: set + 属性首字母
大写 - setName setAge
value: 属性的值: 支持 8大基本数据类型 和String类型
ref : 属性引用值: 引用类型属性赋值
-->
</bean>
<bean name="myCar" class="com.bjlemon.pojo.Car">
<property name="brand" value="奥迪"/>
<property name="name" value="A6L"/>
<property name="price" value="300000.33"/>
</bean>
- 构造器注入:调用构造器注入
<bean name="yourCar" class="com.bjlemon.pojo.Car">
<constructor-arg name="name" value="X6"/>
<constructor-arg name="brand" value="宝马"/>
<constructor-arg name="price" value="500000"/>
</bean>
- 集合注入
<bean name="p3" class="com.bjlemon.pojo.Person">
<property name="name" value="刘德华" />
<property name="age" value="55" />
<property name="car" ref="myCar" />
<!-- List 注入 -->
<property name="list">
<list>
<value> 苹果 </value>
<value> 900 </value>
<ref bean="yourCar" />
<!--内部 匿名bean-->
<bean class="com.bjlemon.pojo.Car">
<constructor-arg index="1" value="吉利" />
<constructor-arg index="0" value="博瑞" />
<constructor-arg index="2" value="120000" />
</bean>
</list>
</property>
<!-- set集合注入 -->
<property name="sets">
<set>
<value>电视</value>
<value>手机</value>
<ref bean="p1"/>
</set>
</property>
- 自动注入
无需手动注入依赖,注入过程交给IOC容器,但是我们需要开启自动开关,同时指定注入方式。
<bean name="car" class="com.bjlemon.pojo.Car" >
<property name=" brand" value="奥迪" />
<property name="name" value="A6L" />
<property name="price" value="300000.33" />
</bean>
<bean name="yourCar" class="com.bjlemon.pojo.Car" >
<constructor-arg name="name" value="X6" />
<constructor-arg name="brand" value="宝马" />
<constructor-arg name="price" value="500000" />
</bean>
<bean name="heCar" class="com.bjlemon.pojo.Car" >
<constructor-arg index="1" value="吉利" />
<constructor-arg index="0" value="博瑞" />
<constructor-arg index="2" value="120000" />
</bean>
autowire=”byName” 通过属性名字从IOC容器中选择同名的bean注入
<bean name=”pp” class=”com.bjlemon.pojo.Person” autowire=”byName”></bean>
Autowire=”byType” 更具属性类型从IOC容器选择同类型的bean注入
<bean name=”pp” class=”com.bjlemon.pojo.Person” autowire=”byType”></bean>
根据属性类型时可能出现异常,可能找到多个满足条件的bean。这时可以设置其他的bean为非候选bean autowire=candidate=”false”
autowire=”constructor”根据构造器参数类型注入,但是会优先考虑名字。
Autowire=”no” 不注入
Autowire=”default”默认注入方式:no
- 注解配置
- 引入名字空间
<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
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
" >http://www.springframework.org/schema/context/spring-context-4.3.xsd">
- 开启组件扫描
<content:component-scan base-package=”com.bjlemon.pojo”/>
- 在需要注入到IOC容器中的Bean头上添加注解
@Component("cc")
public class Car {
.....
}
@Component标记此类为一个组件
Spring在扫描时,发现此类为组件,就会把他注入到IOC容器。注入后的bean的名字为类名的首字母小写的单词作为bean的名字。如果,需要自定义名字。测@component(“beanName”)
Component是一个Bean组件通用注解,此组件没有业务上的含义,但是在实际开发中,组件来自各个领域。
比如:控制器contrller,Service,Dao,为了更加明确体现各层组件,spring提供更加细化的注解。
业务层:@Service
控制层:@Controller
持久层:@Repository
@Autowire(required=true):自动注入依赖,注入类型是byType,默认是required=true,表示必须注入一个,否则报错。
@Qualifier(“beanName”):和@Autowire连用,变成根据名字注入。
@Resource(name=“beanName”)根据名字注入。名字注入不成功再按类型,不是spring提供,JSR规范。
@Value:注入属性,基本数据类型&String
@Configuration:基于Java配置的注解,表示该类是一个配置类,类似xml的作用。
@Bean:表示一个java bean,能够注册到IOC容器中。