出一个简单的Spring框架入门教程
向spring申请一个User对象:
ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("ApplicationContext.xml");
User bean = (User)ac.getBean("user");//根据id获取User对象,每次获取的对象都是同一个
那么如何给配置在xml文件里对象赋值?可以使用依赖注入(就是在xml文件里事先配置好属性地值):
<bean name="user" class="com.echo.bean.User">
<property name="u_id" value="5"></property>
</bean>
Spring-Ioc | DI 概念:(要实现IOC依赖DI的支持 )
IoC:反转控制
反转:将我们自己创建对象的工作交给Spring容器帮我们完成
控制:就是有Spring帮我们负责创建销毁对象,掌控对象的生命周期,我们在需要使用对象的时候跟Spring申请即可
IOC是一种编程思想,也是一种新的设计模式,它将帮助我们管理对象,它需要DI(依赖注入)技术的支持,维护依赖关系
DI:依赖注入
将值通过配置的方式为变量初始化 / 赋值(注入)
bean标签属性:
lazy-init(懒加载):
在ClassPathXmlApplicationContext对象创建时,容器中的所有对象都会被自动创建
如果配置大量的bean,会导致内存过大
Spring推出了延迟加载解决这一问题(懒加载):
<!---->
<!--就是直到要使用时才加载-->
<bean name="user" class="com.echo.bean.User" lazy-init="true">
<property name="u_id" value="5"></property>
</bean>
scope:
singleton(常用):单例模式(默认)
prototype(特殊时使用):多例模式(每次申请都新构造一个新的对象,如果使用该属性值,创建的对象就会交给程序员管理,不再由Spring管理)
request(不常用):在web环境下,如果scope属性为request,那么这个对象被创造出来时。它的生命周期会与request一致
session(不常用):同理,生命周期与session一致
初始化方法Init-method和销毁方法destroy-method
Init-method:如果对象需要在创建后调用一些初始化方法(非构造器),可以使用这个属性设置
destroy-method:如果对象在销毁前需要调用一些方法(例如释放资源),可以使用这个属性设置,该方法在容器关闭后激活(单例模式有效)
Spring属性注入:(在xml中配置属性)
Setter方法注入:如果要注入属性,则类中必须要有属性对应的Setter方法
引用类型(自定义类型):如果对象中包含另一个对象的引用(自定义类型),则需要再同级标签下再配置一个该类型的bean,然后在主对象中使用ref关联起来:
<bean name="user" class="com.echo.bean.User">
<property name="u_id" value="5"></property>
<property name="u_username" value="echo"></property>
<property name="pet" ref="pet"></property>
</bean>
<bean name="pet" class="com.echo.bean.Pet">
<property name="name" value="mypet"></property>
</bean>
构造方法注入:利用带参构造器注入
无参构造器是必须提供的,spring用无参构造器创建对象
构造方法注入只是将属性注入
<!--要把构造器所有的参数都配置上-->
<bean name="userplus" class="com.echo.bean.User">
<constructor-arg name="u_username" value="abc" type="java.lang.String"></constructor-arg>
<constructor-arg name="u_password" value="abc" type="java.lang.String"></constructor-arg>
</bean>
复杂类型注入(Array、List、Set、Map、Properties):
示例:被注入的java类:
public class Col {
//以下getter、setter省略
private Object[] array;
private ArrayList list;
private Map map;
private Properties properties;
private Set set;
</property>
<property name="map">
<map>
<!--map内容使用entry包围,在其中设置key和value-->
<entry key="A" value="a"></entry>
<entry key="B" value="b"></entry>
<!--同样可以设置引用类型的key和value-->
<entry key-ref="user" value-ref="pet"></entry>
</map>
</property>
<property name="properties">
<props>
<!--prop的value直接写在标签里-->
<prop key="name">root</prop>
<prop key="password">123456789</prop>
</props>
</property>
</bean>
Spring注解配置:
可以使用注解配置将对象交给Spring管理,首先要打开基本扫描:
<!-- 开启组件扫描 base-package扫描该包下以及子包的所有注解-->
<context:component-scan base-package="com.echo.bean"></context:component-scan>
打开这个Spring就会自动扫描包下的所有注解
Spring注解:
@Component():
在类定义的顶上加入该注解,则会将该类的实例交给Spring管理,例如:
@Component("user2")
public class User2 {
...
}
Spring为了区分对象在不同层的注解使用了以下注释:
//功能和@Component("user2")一样,只是名称不同,有利于区分
@Controller("user2") //对应web层
@Service("user2") //对应service层
@Repository("user2") //对应Dao层
@Scope:
使用方式:
将值赋值给scopeName,也可以省略scopeName
@Scope(scopeName = "prototype")
public class User2 {
...
@PostConstruct:
在构造器调用后调用
@PreDestroy:
在对象销毁前调用
Spring注解注入:
@Value():
注入基本数据,可以给成员变量注解,也可以给方法注解,如果成员变量私有,推荐在setter方法上使用该注解。
@Resource和@Autowired:
以上两种注解用来输入引用数据,作用是可以消除代码中的setter和getter,还有bean中的properties属性
@Autowired:
自动装配,如果设置该注解,Spring会自动在管理的类中按照查找同类型的实例,并填装上,如果找到多个或没有找到,就报错。
@Resource:
功能同上,需要设置name,用来指定填装的实例,而不是自动查找,比Autowired推荐使用。
Spring集成的JUnit测试:
@RunWith(SpringJUnit4ClassRunner.class)//使用junit进行测试,帮我们创建容器
@ContextConfiguration("classpath:ApplicationContext.xml")
public class SpringJunit {
//可以直接从容器中获取对象
@Resource(name = "user")
private User user;
@Test
public void test() {
System.out.println(user);
}
Spring分包配置:
如果有多个配置文件
可以通过import将某个配置文件添加到其他配置文件中
<!--导入其他配置文件-->
<import resource="ApplicationContext.xml"/>
1
2
配置Spring随项目启动:
在web.xml中加入监听器配置:
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:ApplicationContext.xml</param-value>
</context-param>
然后可以在java中调用容器:
WebApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(getServletContext());
1
Spring-aop中的一些名词:
新加坡和马来西亚将发热监测标准定为高于37.5℃
出一个简单的Spring框架入门教程相关推荐
- Java Spring框架入门详解教程【多测师_何sir】
Spring框架入门详解教程 spring概述 spring结构 spring IOC spring DI spring概述 Spring是一个非常活跃的开源框架, 它是一个基于IOC和AOP来构架多 ...
- Tornado框架入门教程
Tornado框架入门教程 Tornado在知乎广为使用,当你用Chrome打开网页版本的知乎,使用开发者工具仔细观察Network里面的请求,就会发现有一个特别的状态码为101的请求,它是用浏览器的 ...
- c++框架有哪些_Java Mybatis框架入门教程_v20200726
MyBatis 的前身是 Apache 的开源项目 iBatis.MyBatis 几乎可以代替 JDBC,是一个支持普通 SQL 查询,存储过程和高级映射的基于 Java 的优秀持久层框架.MyBat ...
- Egg框架入门教程合集之插件/工具/教程/专栏/开源项目
Egg框架入门教程之示例合集 Awesome Egg.js 很棒的清单,精选了最好的Egg.js插件,工具,教程,文章等.欢迎公关! 内容 博客 文章 讲解 会议活动 外挂程式 应用领域 样板 构架 ...
- Spring Cloud入门教程(二):客户端负载均衡(Ribbon)
对于大型应用系统负载均衡(LB:Load Balancing)是首要被解决一个问题.在微服务之前LB方案主要是集中式负载均衡方案,在服务消费者和服务提供者之间又一个独立的LB,LB通常是专门的硬件,如 ...
- 手写代码,简单实现Spring框架
Java核心编程高阶实战案例:MySpring 本博文通过学习 中国大学MOOC 平台上陈良育老师讲的 Java核心技术(高阶) 课程,因为老师视频中的讲解有些较为简略,于是我自己另外搜集资料,从老师 ...
- Spring Boot入门教程(四十一):微信支付集成-扫码支付
分享一个朋友的人工智能教程.比较通俗易懂,风趣幽默,感兴趣的朋友可以去看看. 一:准备工作 使用微信支付需要先开通服务号,然后还要开通微信支付,最后还要配置一些开发参数,过程比较多. 申请服务号(企业 ...
- 网络爬虫笔记 :一个简单的爬虫框架
学了两节课的 Python 爬虫,也算是入门了吧.敲了两天的案例代码之后,我突然发现,这些代码虽然功能不同,写法各异,但是终归是有章可循的,整体框架是一致的.所以我自己整理了一个简单的爬虫框架,适合初 ...
- 搭建一个简单springboot后端框架
前言 框架知识是每个程序员都应该或多或少都要有所了解,作为后端开发更是以后进阶架构师必备的知识储备:以此为出发点,我们可以从搭建一个简单的后端框架开始,了解相关的技术点和搭建思路. 我们可以从创建项目 ...
最新文章
- AndroidStudio 3.0升级之compile、implementation简要说明
- java课程设计日历记事本代码,已开源
- Spring(四)Bean注入方试
- Java实现最小二乘法线性拟合,传感与检测,单臂半桥全桥实验,江南大学自动化
- android 获取webView高度,设置webView高度
- mysql innodb monitor_MySQL innodb_table_monitor 解析
- 恢复计算机硬盘数据,计算机数据恢复,小编教您如何恢复计算机数据
- 话说网页长啥样,到底谁说了算??
- vue js代码混淆加密、压缩
- ue4联网和多人游戏总结(第二部分)
- 快播资源哪里跑(逆向)
- 二维空间:点到直线距离的计算
- 还在为表情包而发愁吗?今天教你用 Python 画一个奸笑(滑稽)表情(内附源码)
- Calendar根据输入的年份和周数计算该周的开始日期和结束日期
- win 10网络适配器没有无线网络连接(连不上WLAN)
- openGL结合光照与纹理
- 全平台系统提权辅助工具 PEASS-ng
- db9接口(db9接口详细接线图)
- 无线授时服务器接LED屏,实现ipad远程无线控制led大屏幕分以下几个步骤!
- 计算机班主任总结范文,中等*学校计算机班主任年度的工作总结
热门文章
- 家用电器用户行为分析与事件识别_用户行为分析埋点实时数仓实践
- 用python写生日祝福的教程_祝豌豆生日快乐 - Python猫的个人空间 - OSCHINA - 中文开源技术交流社区...
- 六、DNS组成与原理
- vs界面竖线光标变成灰色方块,输入时替代已有字符
- 组队练习赛(Regionals 2012, North America - East Central NA)
- 发布国内首个无服务器容器服务,运维效率从未如此高效
- 译-在Python正则模式中search()和match()的区别是什么?
- Android平台调用WebService详解
- 初学者应该了解的编程陷阱:javascript篇
- [zz] 深入java虚拟机之本地方法