Spring概念
Spring是一个开源轻量级框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。Spring的核心是控制反转(IoC)和面向切面(AOP)。
spring核心主要两部分:
(1)aop:面向切面编程,扩展功能不是修改源代码实现
(2)ioc:控制反转,
- 比如有一个类,在类里面有方法(不是静态的方法),调用类里面的方法,创建类的对象,使用对象调用方法,创建类对象的过程,需要new出来对象
- 把对象的创建不是通过new方式实现,而是交给spring配置创建类对象
IOC底层原理
1 ioc底层原理使用技术
(1)xml配置文件
(2)dom4j解决xml
(3)工厂设计模式
(4)反射
2.实现过程
通过xml实现通过map的键值对放入 键class 值完整的类全名(指向相关联的类),并为其设置 键id 值(随意不过一般是类名) 。
通过dom解析将得到类全名
在通过类全名使用反射创建类对象
图片解释
IOC入门案例
所需jar包(https://download.csdn.net/download/qq_35654259/10618401)
配置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"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
</beans>
在xml文件中配制对象创建
<bean id="user3" class="com.yc.test.bbs.bean.User3">
</bean>
最终的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"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<bean id="user3" class="com.yc.test.bbs.bean.User3">
</bean>
</beans>
创建所对应的User3.java文件(注意包名必须与配置的class的值一致)
package com.yc.test.bbs.bean;
import java.sql.Timestamp;
import java.util.List;
import java.util.Properties;
/**
* 用户实体类
*/
public class User3 {
/**
* 用户ID
*/
private Integer uid;
/**
* 用戶名
*/
private String uname;
/**
* 用户密码
*/
private String upass; // 加密后的长度比较长
/**
* 用户头像
*/
private String head; // 头像的图片路径
/**
* 注册时间
*/
private Timestamp regtime; // 注册时间 Timestamp 带时分秒的日期
/**
* 用户性别:1男,0女
*/
private Integer gender; // 性别 1男,0女
/**
* 用户发帖集合
*/
private List<Topic> topicList;
private Properties pros;
public Properties getPros() {
return pros;
}
public void setPros(Properties pros) {
this.pros = pros;
}
public Integer getUid() {
return uid;
}
public void setUid(Integer uid) {
this.uid = uid;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getUpass() {
return upass;
}
public void setUpass(String upass) {
this.upass = upass;
}
public String getHead() {
return head;
}
public void setHead(String head) {
this.head = head;
}
public Timestamp getRegtime() {
return regtime;
}
public void setRegtime(Timestamp regtime) {
this.regtime = regtime;
}
public Integer getGender() {
return gender;
}
public void setGender(Integer gender) {
this.gender = gender;
}
public List<Topic> getTopicList() {
return topicList;
}
public void setTopicList(List<Topic> topicList) {
this.topicList = topicList;
}
}
IOC案例的测试
package com.yc.test;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.yc.test.bbs.bean.User3;
public class User3Test {
protected ApplicationContext context;
@Before
public void before() throws Exception{
//加载Spring配置文件,根据文件创建对象
context = new ClassPathXmlApplicationContext("User3.xml");
}
@Test
public void TestUser3(){
//得到通过反射创建的对象
User3 user = (User3) context.getBean("user3");
User3 user1 = (User3) context.getBean("user3");
System.out.println(user);//(若对象能创建则会输出对象的地址)com.yc.test.bbs.bean.User3@1a0f02a
System.out.println(user1);//(若对象能创建则会输出对象的地址)com.yc.test.bbs.bean.User3@1a0f02a
System.out.println(user == user1);//true
}
}
问题
最后给大家提一个问题为啥最后的user和user1是同一个对象(可以去了解di 依赖注入)