Web层(表现层)
SpringMVC
Struts2
Service层(业务层)
Spring
Dao层(持久层)
JdbcTemplae(Spring)
MyBatis
Hibernate/Jpa/SpringDataJpa
Spring框架在JavaEE的三层架构中都可以完成对应功能开发!!
spring又可分为7大模块:
- Spring Core (IOC容器):创建对象,给对象属性赋值 ***
2)Spring AOP(面向切面编程): 事务管理,自定义AOP编程 ***
3)Spring ORM :Spring整合ORM框架(Hibernate/JPA)* - Spring JDBC : 提供JdbcTemplate的,对Jdbc简单封装 *
5)Spring Web: Spring整合Web(Servlet,Filter)*
6)SpringMVC:Spring提供MVC表现层模块 ***
7)Spring Context: 国际化,事件驱动编程
IOC容器的好处: 解耦!!!
2,程序中解耦应用-控制反转
什么是IOC和DI?,
IOC,Inverse Of Control 控制反转,把创建对象的权力,由自己创建(new)改为工厂来创建。解决创建对象的耦合问题!
DI,Denpedency Injection 依赖注入,把对象属性赋值的权力,由自己完成改为工厂来完成。解决给对象属性赋值的耦合问题!
bean标签配置细节
- id: 给创建的对象一个别名(必须唯一的) (推荐使用)
2) class: 需要创建类的全名(注意必须是类的全名)
3) name: 给创建的对象创建多个别名,别名之间使用,逗号隔开
4) scope: 创建对象的作用域,创建单例对象还是多例对象
singleton: 单例的,默认值。每次调用getBean方法获取的对象都是同一个!
prototype: 多例的。每次调用getBean方法都会创建一个新的对象!
request: web中使用。每个用户的请求都会创建一个新的对象!
session: web中使用。每个session会话中都会创建一个新的对象!
glbalsession: web中使用。在web集群环境中使用,在同一个集群环境下,只会有一个对象!
5)lazy-init: 是否延迟创建对象。
false: 不延迟,默认值。在创建IOC容器的时候,就会根据bean配置创建好对象,等待程序来获取
true: 延迟。在创建IOC容器的时候,先不创建对象,等到程序来获取(getBean)的时候再创建对象
6) init-method和destroy-method: 对象的生命周期方法(要在实体类上也创建相应的方法)
init-method: 初始化方法。在创建完对象后立即调用init-method
destroy-method: 销毁方法。在销毁对象之前调用destroy-method
创建容器的三种方式:
1,绝对路径(从根目录)
2,相对路径(从项目src目录开始查询)
3,使用类路径方式: 项目的类路径,就是在resources目录下 (推荐使用)
SpringIOC容器创建对象的三种方式:
方式1:默认无参数构造函数创建对象(推荐方式)
方式2:工厂类的静态方法创建对象
方式3:工厂类的实例方法创建对象
<?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">
<!--
IOC容器创建对象的三种方式
-->
<!-- 1. 默认无参的构造方式
注意:需要创建的对象必须提供无参构造方式
-->
<!-- <bean id="person" class="com.huihui.pojo.Person"/>-->
<!-- 2.工厂类的静态方法 -->
<!--
底层: Person person = PersonFactory.getPersonByStatic();
class: 工厂类的全名
factory-method: 工厂类的一个静态方法名称
-->
<!--<bean id="person" class="com.huihui.pojo.PersonFactory" factory-method="getPersonByStatic"></bean>-->
<!-- 3. 工厂类的实例方法 -->
<!--
底层:
PersonFactory factory = new PersonFactory();
Person person = factory.getPerson();
-->
<!-- 3.1 先创建工厂类对象 -->
<bean id="factory" class="com.huihui.pojo.PersonFactory"/>
<!-- 3.2 使用工厂对象调用实例发方法
factory-bean: 创建工厂对象的id
factory-method: 工厂类的实例方法
-->
<bean id="person" factory-bean="factory" factory-method="getPerson"/>
</beans>
SpringIOC容器依赖注入
DI, 依赖注入,关注的就是怎么给对象的属性去赋值!
1:构造器赋值: 依赖注入:给对象属性赋值
1. 带参数的构造方式
constructor-arg 标签的使用
1)value: 需要传递的参数值(仅限基本类型)
2) index: 参数的索引号,从0开始,不写index,按照配置从下往下的顺序加载
3) name: 指定方法的形参名称来进行赋值, 不写,就自动匹配形式参数名称
4)type: 指定方法的参数类型赋值, 默认不写就是String类型
5) ref: 引用类型,引用IOC容器的另一个bean(对象)
注意:value和ref只能使用其中一个
2 :使用setter方法注入
property: 通过调用setter进行赋值
name: setter方法名称。去掉set,把首字母小写
<bean id="person" class="com.huihui.pojo.Person">
<property name="id" value="666"/>
<property name="username" ref="str"/>
</bean>
3:p命名空间
先导入p名称空间,然后再在bean.xml
<bean id = "".....................p:id="999" p:username-ref="str"/>
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
/**
*
*/
public class Person {
//定义属性
private int id;
private String username;
private String sex;
public Person(){
System.out.println("创建Person对象!!");
}
//方式一:使用带参数的构造方式进行属性的依赖注入
public Person(int id,String username){
this.id = id;
this.username = username;
}
public Person(String sex,String username){
this.sex = sex;
this.username = username;
}
//方式二:使用setter方法对属性辅助
public void setId(int id) {
System.out.println("调研Person的setId");
this.id = id;
}
public void setUsername(String username) {
System.out.println("调研Person的setUsername");
this.username = username;
}
//集合类型
private List<String> list;
private Set<String> set;
private Map<String,String> map;
private String[] array;
private Properties properties;
public void setSex(String sex) {
this.sex = sex;
}
public void setList(List<String> list) {
this.list = list;
}
public void setSet(Set<String> set) {
this.set = set;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
public void setArray(String[] array) {
this.array = array;
}
public void setProperties(Properties properties) {
this.properties = properties;
}
@Override
public String toString() {
return "Person{" +
"id=" + id +
", username='" + username + '\'' +
", sex='" + sex + '\'' +
'}';
}
}