Spring入门
1.什么是Spring
spring是为了解决企业级开发中用户数量多,数据规模大,功能多,性能要求,安全性要求等问题而推出的轻量级的开源的java开发的框架
03年兴起的至今已有17年
Spring 的核心是控制反转IoC容器和面向切面编程(AOP实现)
Mybatis框架->dao层(有其他替代框架)
Spring框架->中间层即服务层、业务逻辑层(没有其他框架代替Spring,足见Spring的强大)
IoC就是DI,只是从不同的角度
2.Spring的作用
主要作用是:解耦(使用IoC降低模块间的耦合,对象间的耦合),不再由自己创建对象(即摒弃了 类名 对象名=new 类名(); 这种创建方法)而是由spring容器统一管理,自动注入(注入即赋值)
Aop使得系统服务得到了极大的复用,不在由程序员手工将系统服务混在业务逻辑中,而是由spring容器统一织入
spring:容器,装的是java对象,可以让spring创建对象,给属性赋值等3.Spring的特性
3.1Spring的优点
轻量级、不到1M、解耦合、针对接口编程,方便集成其他的框架
Spring官网地址,点此进入
在官网中我们可以看到spring可以做如下开发:
找到View all projects进入后可以看到"spring全家桶"如下图所示:
3.2下载和学习相关资源
全英文的文档,你可以使用翻译软件查看中文版本的
3.3Spring约束
spring使用更强大的xsd约束
4.Spring框架结构
5.Ioc(控制反转)的概念
inversion of control:一个理论,指导思想,指导程序员如何使用对象,管理对象,把对象处理交给容器
控制:对象的创建、赋值、生命周期的管理反转:把权限给了代码之外的容器来管理
正转:由new创建对象,开发人员拥有操作对象的全部权限
通过容器可以使用容器中的对象(容器已经创建对象,组装好对象)
6.依赖注入DI
Ioc的技术实现DI:Dependency Injection,程序只需要提供要使用的对象的名称即可,对象如何创建、查找、获取都由容器内部自己实现
依赖:比如class A 使用class B的属性或方法,叫做class A 依赖class B
DI从技术的角度更加清晰的描述了Ioc所要做的事情
spring使用di实现ioc,通过名称即可拿到对象
spring底层使用的是反射机制来创建,而不是序列化或者new
7.AOP
7.1什么是aop编程思想
把纵向编码发展为横向编码,给某一块代码添加一些新的功能
织入:就是切入,将切面与切入点结合这是个逻辑过程
通知:增强方法
切入点:选定的方法
切面:被通知的对象
连接点:任何类的方法
7.2什么是纵向编码??什么是横向编码
在JavaSE的学习中,我们常用的代码复用方法是继承,通过继承的方法可以实现业务逻辑,
继承是树状的,如下所示,即为向下发展的编程逻辑
然而运用了面向切面编程的思想之后
面向切面是从继承体系结构上逐步横向发展来的
8.第一个Spring案例
8.1项目架构
8.2编写Users类
package com.ddb.spring;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class Users {
private String name;
private String address;
private String memo;
@Override
public String toString() {
return "Users [name=" + name + ", address=" + address + ", memo=" + memo + "]";
}
}
8.3编写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"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
<bean id="users" class="com.ddb.spring.Users">
<property name="name">
<value>sxh</value>
</property>
<property name="address" value="wuhu"/>
<property name="memo" value="This is my first Spring project"/>
</bean>
</beans>
可以将以上配置文件简化成如下的格式:
<beans>
<bean id="" class="包名+类名">
<property name="">
<value></value>
</property>
</bean>
</beans>
主配置文件的根路径:<beans>
</beans>
<bean></bean>
是子路径
id:给javabean取个名字
class:这个bean的全路径
<property></property>
包裹这个bean的一个属性
name:属性的名字,一一对应
value:属性对应的值
8.4编写properties文件
此文件,不是必须
# rootLogger是所有日志的根日志,修改该日志属性将对所有日志起作用
# 下面的属性配置中,所有日志的输出级别是info,输出源是console
log4j.rootLogger=info,console
# 定义输出源的输入位置是控制台
log4j.appender.console=org.apache.log4j.ConsoleAppender
# 定义输出日志的布局采用的类
log4j.appender.console.layout=org.apache.log4j.PatternLayout
# 定义日志输出布局
log4j.appender.console.layout.ConversionPattern=%d %p [%c] - %m%n
8.5编写测试类
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
private static ApplicationContext ctx;
public static void print(Object object) {
System.out.println(object);
}
public static void test1() {
Users users=new Users();//new 一个对象
users.setName("Teacher");
users.setAddress("hefei");
users.setMemo("This is my first Spring project!!");
print(users);
}
public static void test2() {
ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
Users users=(Users) ctx.getBean("users");
print(users);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
test1();//原来的方法
test2();
}
}
关于命名规范:
类名:每个首字母大写
包名:全小写