Spring基础入门(一)
一、Spring概念
1.什么是Spring
Spring是一个开源框架,它由Rod Johnson创建。它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。 -----转自百度百科
简单来说,Spring 是一个分层的 JavaSE/EEfull-stack(一站式) 轻量级开源框架。
2.为什么要学习Spring###
- 方便解耦,简化开发
Spring 就是一个大工厂,可以将所有对象创建和依赖关系维护,交给 Spring 管理 - AOP 编程的支持
Spring 提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能 - 声明式事务的支持
只需要通过配置就可以完成对事务的管理,而无需手动编程 - 方便程序的测试
Spring 对 Junit4 支持,可以通过注解方便的测试 Spring 程序 - 方便集成各种优秀框架
Spring 不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts、Hibernate、MyBatis、Quartz 等)的直接支持 - 降低 JavaEE API 的使用难度
Spring 对 JavaEE 开发中非常难用的一些 API(JDBC、JavaMail、远程调用等),都提供了封装,
使这些 API 应用难度大大降低
3.Spring核心##
- 1.ioc:控制反转(对象的创建不是new出来的,而是通过Spring配置创建)
- 2.aop:面向切面编程(拓展功能不通过修改源代码实现)
二、Spring的IOC操作#
这里使用IDEA创建Spring项目,IDEA会自动帮你下载Spring所需要的jar包,也可以选择是否帮你创建spring配置文件###
IDEA生成的配置文件“spring-config.xml”,用来进行配置
<?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">
</beans>
你也可以选择自己创建一个配置文件,如图所示
- 注意:spring核心配置文件名称和位置不是固定的,建议放到src下面,官方建议applicationContext.xml
1.通过xml实现ioc操作##
(1)通过无参构造方法创建
Spring可以通过类的无参构造来创建bean
①首先创建一个Bean1.java
package com.spring.test_1;
public class Bean1 {
public void test()
{
System.out.print("test bean...");
}
}
②然后在idea创建的spring-config.xml中做如下配置,这里id是用来获取配置对象的,class是类的路径。
<bean id="bean1" class="Bean1"></bean>
这里要引入schema约束,否则会在之后加载配置文件时会出现错误提示,在联网的情况下,idea会自动帮你导入,无网络的话,也可以自己手动导入,这里不再详解。
③写代码测试对象创建
@Test
public void fun1() {
//加载配置文件
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-config.xml");
//通过id创建对象
Bean1 bean1 = (Bean1) applicationContext.getBean("bean1");
//调用test方法
bean1.test();
}
注意:如果类中没有无参构造的话会抛出异常(No default constructor found)
测试结果如下:
(2)通过静态工厂创建
①创建静态方法,返回类对象
package com.spring.test_1;
public class Bean2Factory {
public static Bean2 getBean2()
{
return new Bean2();
}
}
②使用静态工厂创建对象
<bean id="bean2" class="com.spring.test_1.Bean2Factory" factory-method="getBean2"></bean>
③测试用例
@Test
public void fun2() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-config.xml");
Bean2 bean2 = (Bean2) applicationContext.getBean("bean2");
bean2.test2();
}
(3)通过实例工厂创建
①创建不是静态的方法,返回类对象
package com.spring.test_1;
public class Bean3Factory {
public Bean3 getBean3()
{
return new Bean3();
}
}
②使用实例工厂创建对象
<!-- 使用实例工厂创建对象 -->
<!-- 创建工厂对象 -->
<bean id="bean3Factory" class="com.spring.test_1.Bean3Factory"></bean>
<bean id="bean3" factory-bean="bean3Factory" factory-method="getBean3"></bean>
测试用例:
@Test
public void fun3() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-config.xml");
Bean3 bean3 = (Bean3) applicationContext.getBean("bean3");
bean3.test3();
}
2.Bean标签属性##
(1)id属性:起名称,id属性值名称任意命名
- id属性值,不能包含特殊符号
- 根据id值得到配置对象
(2)class属性:创建对象所在类的全路径
(3)name属性:功能和id属性一样的,id属性值不能包含特殊符号,但是在name属性值里面可以包含特殊符号
(4)scope属性
singleton:默认值,单例,创建的对象在系统中只有一份
<bean id="bean1" class="Bean1" scope="singleton"></bean>
测试用例:
@Test
public void fun4() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-config.xml");
Bean1 bean1 = (Bean1) applicationContext.getBean("bean1");
Bean1 bean2 = (Bean1) applicationContext.getBean("bean1");
System.out.println(bean1);
System.out.println(bean2);
}
测试结果:
prototype:多例,每一次创建都对应一个新的对象
bean id="bean1" class="com.spring.test_1.Bean1" scope="prototype"></bean>
测试结果:
- request:创建对象把对象放到request域里面
- session:创建对象把对象放到session域里面
- globalSession:创建对象把对象放到globalSession里面
3.属性注入##
(1)属性注入有三种方式###
- 使用set方法注入
- 使用有参构造注入
- 使用接口注入
注意:spring支持前两种方式
①使用有参构造注入
<!--使用有参构造注入属性-->
<bean id="user" class="com.spring.test_2.User">
<constructor-arg name="username" value="张三"></constructor-arg>
<constructor-arg name="password" value="123456"></constructor-arg>
</bean>
user.java
public class User {
private String username;
private String password;
public User(String username, String password) {
this.username = username;
this.password = password;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
配置文件中注入的属性必须与有参构造的参数相同,否则会报错。
②使用set()注入
使用set注入时,类中必须存在属性的set方法
<!--使用set()注入-->
<bean id="user2" class="com.spring.test_2.User2">
<property name="username" value="李四"></property>
</bean>
user2.java
public class User2 {
private String username;
public void setUsername(String username) {
this.username = username;
}
@Override
public String toString() {
return "User2{" +
"username='" + username + '\'' +
'}';
}
}
(2)注入对象类型属性###
首先新建一个UserService.java
public class UserService {
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void testService() {
userDao.testDao();
System.out.println("UserService...");
}
}
然后创建一个UserDao.java
public class UserDao {
public void testDao()
{
System.out.println("UserDao...");
}
}
再在配置文件中进行如下配置
<!--注入对象类型属性-->
<bean id="userDao" class="com.spring.test_2.UserDao"></bean>
<bean id="userService" class="com.spring.test_2.UserService">
<property name="userDao" ref="userDao"></property>
</bean>
注意:property中的ref必须与UserDao的bean的id相同
测试结果:
(3)注入复杂类型属性###
新建一个ComplexPro类,其中包括array,list,map以及properties这四种属性,并生成各自的set方法。
import java.util.List;
import java.util.Map;
import java.util.Properties;
public class ComplexPro {
private String[] arrs;
private List<String> list;
private Map<String , String> map;
private Properties properties;
public void setArrs(String[] arrs) {
this.arrs = arrs;
}
public void setList(List<String> list) {
this.list = list;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
public void setProperties(Properties properties) {
this.properties = properties;
}
public void test()
{
System.out.println("arrs"+arrs);
System.out.println("list"+list);
System.out.println("map"+map);
System.out.println("properties"+properties);
}
}
在spring-config.xml中进行配置
<!--注入复杂类型属性-->
<bean id="complexPro" class="com.spring.test_2.ComplexPro">
<property name="arrs">
<list>
<value>张三</value>
<value>李四</value>
<value>王五</value>
</list>
</property>
<property name="list">
<list>
<value>张三</value>
<value>李四</value>
<value>王五</value>
</list>
</property>
<property name="map">
//map中保存的是一个个键值对
<map>
<entry key="张三" value="123"></entry>
<entry key="李四" value="456"></entry>
<entry key="王五" value="789"></entry>
</map>
</property>
<property name="properties">
<props>
<prop key="username">root</prop>
<prop key="password">123</prop>
</props>
</property>
</bean>
测试结果:
(4)IOC与DI的区别###
- IOC: 控制反转,把对象创建交给spring进行配置
- DI: 依赖注入,向类里面的属性中设置值
- 两者关系:依赖注入不能单独存在,需要在ioc基础之上完成操作
4.通过注解实现IOC操作##
1.注解创建对象###
注解实现ioc很简单,只需要在配置文件中开启注解扫描就可以使用注解了
使用注解需要引入新约束
"http://www.springframework.org/schema/context/spring-context.xsd"
联网状态idea会自动引入
<!--注解扫描-->
<!--扫描包中的类、方法、属性上的注解-->
<context:component-scan base-package="com.spring.test_3"></context:component-scan>
<!--只扫描属性上的注解,一般不推荐使用-->
<!--<context:annotation-config></context:annotation-config>-->
注意:这里的base-package属性是扫描范围,多个包之间用空格隔开,但是同一个包内可以扩大范围,比如说com.spring就是扫描com.spring包以及子包的所有类
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component(value = "user") //value可省略
//spring提供了@Component的三个衍生注解,但目前来说功能一样
/*
@Service("user")
@Controller("user")
@Repository("user")
*/
@Scope(value = "prototype")//创建对象是单例还是多例
public class User {
@Value("李四")
private String username;
public void test() {
System.out.println("注解创建对象....");
}
public void testUsername()
{
System.out.print("username="+username);
}
}
2.注解注入属性###
(1)注入普通属性
@Value("李四")
private String username;
(2)注入对象属性
创建UserService类和UserDao类,并创建对象
import org.springframework.stereotype.Controller;
@Controller("userDao")
public class UserDao {
public void testDao()
{
System.out.println("userDao....");
}
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
public class UserService {
private UserDao userDao;
public void testService()
{
userDao.testDao();
System.out.println("userService....");
}
}
在service中定义dao属性
@Autowired
private UserDao userDao;
//使用注解不需要set方法
//注入属性第二个注解Resourc(name = "userDao")
本节的Demo已上传github,如有需要请下载###
https://github.com/LELE-QAQ/TestSpring
Spring基础入门(一)的更多相关文章
- Spring基础入门
一.Spring了解 Spring:程序员们的春天 Spring主要技术是IOC.AOP两个大概念 它是轻量级的,每个jar包就1M ~ 3M 左右,所以速度快 面向接口编程:降低了耦合度 面向切面编 ...
- Spring 基础入门(一)
本文代码部分来自于<spring in action>,本文讲的是使用!! Spring 是为了解决什么 一个框架的存在是为了解决某个问题的,那么Spring这个框架是为了解决什么问题呢? ...
- Spring基础入门(二)
一.AOP 1.AOP概念 aop:面向切面编程,扩展功能不修改源代码实现. AOP采取横向抽取机制,取代了传统纵向继承体系重复性代码. 2.AOP原理 (1)第一种情况,有接口情况,使用动态代理创建 ...
- Spring基础入门(三)
一.Spring的jdbcTemplate操作 (1)Spring是一站式框架,对于javaee三层,每一层都有解决技术. web层:springMVC service:spring的ioc dao层 ...
- [Spring框架]Spring AOP基础入门总结二:Spring基于AspectJ的AOP的开发.
前言: 在上一篇中: [Spring框架]Spring AOP基础入门总结一. 中 我们已经知道了一个Spring AOP程序是如何开发的, 在这里呢我们将基于AspectJ来进行AOP 的总结和学习 ...
- [Spring框架]Spring AOP基础入门总结一.
前言:前面已经有两篇文章讲了Spring IOC/DI 以及 使用xml和注解两种方法开发的案例, 下面就来梳理一下Spring的另一核心AOP. 一, 什么是AOP 在软件业,AOP为Aspect ...
- Spring Boot 入门之基础篇(一)
原文地址:Spring Boot 入门之基础篇(一) 博客地址:http://www.extlight.com 一.前言 Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是 ...
- Java基础-SSM之Spring MVC入门篇
Java基础-SSM之Spring MVC入门篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Spring MVC简介 1>.什么是Spring MVC 答:Sprin ...
- Java基础-SSM之Spring快速入门篇
Java基础-SSM之Spring快速入门篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java ...
随机推荐
- 学习笔记 第八章 使用CSS美化列表
第8章 使用CSS美化列表 8.1 列表的基本结构 在HTML中,列表结构可以分为两种基本类型:有序列表和无序列表.使用标签如下: <ul>...</ul>:标识无序列表: ...
- mysql 判断字符串是否为其他字符串的子集
1.mysql 提供单个用逗号隔开判断某个字符串是否包含在其他字符串的之内:FIND_IN_SET('需要匹配的字符串','源字符串'); demo: select FIND_IN_SET('111' ...
- 内存管理总结-autoreleasePool
转自其他 序言 无论是在MRC时期还是ARC时期,做过开发的程序员都接触过autoreleasepool.尽管接触过但本人对它还不是很了解.本文只是将自己的理解说出来.在内存管理的文章中提到了OC的内 ...
- Int 1的实现过程 (一)
闲话少说,直奔主题,首先OD载入一个程序,然后执行一下单步(调试器会将TF置1) 此时,CPU会在基于当前线程上下文的环境中,进入int 1的中断门,也就是KiTrap01 kd> !idt - ...
- 解剖嵌入式设备开发时以SD卡启动时SD卡的存储结构(以三星exynos4412为例)
目前面对高性能产品的嵌入式开发中,用SD卡来代替以往的JLINK显得备受大家喜欢,而且MCU厂家也对以SD卡启动的支持度越来越大,反而对JLINK不在那么重视(不过依旧保留着).一些以开发开发板的公司 ...
- python练习1 登录和三级菜单
,: username1 = input("请输入您的用户名:")# password1 = getpass.getpass("请输入您的密码:") passw ...
- Python框架Django的入门
本篇文章主要给大家介绍Django的入门知识:
- CGContextAddArc
这个函数让我在纸上画了半天才搞明白,把我的理解给大家分享下. void CGContextAddArc(CGContextRef c, CGFloat x, CGFloat y, CGFloat ra ...
- Chrome插件:微信公众号自动登录(chrome.extension)
manifest.json: { "manifest_version": 2, "name": "WX.AutoLogin", " ...
- struct 和class 区别
最开始,就让我们来讨论一下一个最最基本,也最最容易被人忽视掉的问题——C++中的struct和class有什么区别?如果谈到C中的struct和C++中的class的区别,你应该会告诉我很多.但我现在 ...