springbootcontroller构造函数_想要彻底搞懂spring源码,⾸先
你得先。。。
1.Spring概述
Spring是Java应⽤轻量级开源框架,所谓轻量级指的是:API简单,运⾏时占⽤资源少。
Spring的核⼼是 IOC(Inverse Of Control:反转控制)和 AOP(Aspect Oriented Programming:⾯向切⾯编程)。
Spring⼀个应⽤框架, 提供了表现层 Spring MVC 和持久层 Spring JDBC 以及业务层事务管理等众多应⽤技术。
Spring还能整合开源世界众多著名的第三⽅框架和类库,逐渐成为使⽤最多的 Java EE 企业应⽤开源框架。
2.IOC(Inverse Of Control)思想
IOC(控制反转)相当于⼀个容器,这个容器⾥⾯放你想放的对象或者要⽤到的对象。之前我们在创建对象直接nw创建。现在有了spring 提供的IOC容器我们可以直接从容器中拿对象。转化了之前创建对象的⽅式,将对象的控制权从程序员⼿中转换到了spring IOC容器中。
3.重要API
两个接⼝
BeanFactory
这是SpringIOC容器的顶级接⼝,它定义了SpringIOC的最基础的功能,但是其功能⽐较简单, ⼀般⾯向Spring⾃⾝使⽤。
BeanFactroy在第⼀次使⽤到某个Bean时(调⽤getBean()),才对该Bean进⾏加载实例化。
javaApplicationContext
这是在BeanFactory基础上衍⽣出的接⼝,它扩展了BeanFactory的功能,⼀般⾯向程序员使⽤。
ApplicationContext是在容器启动时,⼀次性创建并加载了所有的Bean。
三个实现类
ClassPathXmlApplicationContext
读取类路径下的xml作为配置⽂件
javaFileSystemXmlApplicationContext
读取本地⽬录下的xml作为配置⽂件
javaAnnotationConfigApplicationContext
读取⼀个Java类作为配置⽂件
⼀个⽅法
getBean()
⽤于从Spring容器中获取Bean对象,参数可以使⽤三种情况:
getBean("id") 使⽤bean的id从容器中查对象
getBean(Bean.class) 使⽤bean的class类型从容器中查对象
getBean("id", Bean.class) 使⽤bean的id 和 class类型从容器中查对象
⼀般⽤第⼆种,当接⼝有多个实现类的时候⼀般⽤第三种这样可以指定具体应⽤哪个实现类,当然⼀个接⼝有多个实现类的情况⾮常少。
4.Bean的配置(xml)
4.1Bean的创建⽅式
new的⽅式创建
这⾥拿创建⼀个UserDao对象举例
这种⽅式会根据默认⽆参构造函数来创建类对象。如果 bean 中没有默认⽆参构造函数,将会创建失败。
id为该对象的名字
class为该对象的实现类
<bean id="userDao" class="com.demo.dao.impl.UserDaoImpl"/>
静态⼯⼚创建
⼯⼚类代码
/**
* @Author WS Hu
* @Date 2020/7/22 18:00
* @Version 1.0
*/
public class FactoryBean {
//静态⼯⼚
public static UserDao createUserDao(){
return new UserDaoImpl();
}
}
在配置⽂件中添加静态⼯⼚创建对象配置
id为该对象的名字
class为静态⼯⼚类
factory-method为⼯⼚中的静态⽅法
<!--使⽤静态⼯⼚创建对象-->
<bean id="userDao" class="com.demo.factory.FactoryBean" factory-method="createUserDao"/>
实例化⼯⼚创建
⼯⼚类代码
/**
* @Author WS Hu
* @Date 2020/7/22 18:00
* @Version 1.0
*/
public class FactoryBean {
//实例⼯⼚
public UserDao createUserDaoSimple(){
return new UserDaoImpl();
}
}
在配置⽂件中添加实例化⼯⼚创建对象配置
第⼀个bean标签中:
id为该⼯⼚类的名字
class为实例化⼯⼚类
第⼆个bean标签中:
id为该对象的名字
class为实例化⼯⼚类
factory-bean为⼯⼚实例
factory-method为⼯⼚中的实例化⽅法
<!--使⽤实例⼯⼚创建对象-->
<bean id="factoryBean" class="com.demo.factory.FactoryBean"/>
<bean id="userDao" factory-bean="factoryBean" factory-method="createUserDaoSimple"/>
4.2bean的作⽤范围
在Spring中,对于bean⽀持五种作⽤范围:
singleton(默认) 单例模式,即对象只创建⼀次, 然后⼀直存在
prototype 多例模式,即每次获取bean的时候,IOC 都给我们创建⼀个新对象request web项⽬中,Spring创建⼀个Bean的对象,将对象存⼊到request域中( 同⼀个r session web 项⽬中,Spring创建⼀个Bean 的对象,将对象存⼊到session域中
globalSession ⽤于分布式web开发中,创建的实例绑定全局session对象
依赖注⼊(Dependency Injection,DI)
给对象中的属性赋值
依赖注⼊有两种⽅式,分别是使⽤构造函数和set⽅法
构造函数
满参构造
//满参构造
public User(String id, String name, Date date) {
this.id = id;
this.name = name;
this.date = date;
}
在配置⽂件中配置相关的值
<!--
构造函数的依赖注⼊
constructor-arg 指的是参数
name ⽤于指定构造函数的形参名称
index ⽤于指定构造函数的形参索引位置⼀般省略
type ⽤于指定构造函数的形参类型⼀般省略底层可以通过反射技术⾃动获取 value ⽤于给简单类型(基本类型基本类型的包装类型 String)的变量赋值
ref="" ⽤于指定⼀个当前容器中已经存在的bean的id
-->
<bean id="user" class="com.demo.domain.User">
<constructor-arg name="id" value="1"/>
<constructor-arg name="name" value="WSH"/>
<constructor-arg name="date" ref="date"/>
</bean>
<bean id="date" class="java.util.Date"/>
set⽅法
JavaBean中的set⽅法
public void setId(String id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setDate(Date date) {
this.date = date;
}
在配置⽂件中配置相关的值
<!--
set⽅法的依赖注⼊
property 指的是属性,需要注意的是属相指的是set⽅法名字抛去set剩下的字段 name ⽤于指定构造函数的形参名称
value ⽤于给简单类型(基本类型基本类型的包装类型 String)的变量赋值
ref="" ⽤于指定⼀个当前容器中已经存在的bean的id
-->
<bean id="user" class="com.demo.domain.User">
<property name="id" value="1"/>
<property name="name" value="WSH"/>
<property name="date" ref="date"/>
</bean>
<bean id="date" class="java.util.Date"/>
IOC注解版
在IOC注解版中我们利⽤⼀些注解实现和配置⽂件相同的功能,省去了繁琐的配置问题。这时候配置⽂件中就不需要写某些配置信息了,在纯注解版中任何配置信息都不需要在配置⽂件中写。
spring ioc注解⾸先要⽤注解我们要在配置⽂件⾥加⼀个爱声明
<!--
组件扫描
它要求我们制定⼀个基础包, Spring会去扫描这个包及其⼦包下的类中的注解只有被Spring扫描到的注解才会发挥作⽤
-->
<context:component-scan base-package="com.demo" />
下⾯总结⼀些注解和应⽤场景
需要说明的是在web层,service层,dao层中推荐使⽤@Controller,@Service,@Repository这三个注解将对象存到容器中
但是在util包domain包等不属于三层的包中想要存对象⼀般⽤@Component
存对象注解
@Component@Controller @Service @Repository
@Component
⽤于实例化对象,相当于配置⽂件中的< bean id="" class=""/>
它⽀持⼀个属性value,相当于xml中bean的id。如果不写,默认值为类名的⾸字母⼩写
@Controller @Service @Repository
这三个注解的功能跟@Component类似,他们分别标注在不同的层上。
@Controller 标注在表现层的类上
@Service 标注在业务层的类上
@Repository 标注在持久层的类上
推荐使⽤这三个,当⼀个类实在不好归属在这三个层上时,再使⽤@Component
例如
将Account对象存⼊IOC容器中(Account在domain包下)
@Component
public class Account {
private Integer aid;
private String name;
private Float balance;
将AccountDaoImpl对象存⼊IOC容器中(dao包下)
将AccountServiceImpl对象存⼊IOC容器中(service包下)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论