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 是一个分层的 JavaSE/EEfull-stack(一站式) 轻量级 开源框架。
EE 开发分成三层结构:
- WEB 层:Spring MVC.
- 业务层:Bean 管理:(IOC)
- 持久层:Spring 的 JDBC 模板.ORM 模板用于整合其他的持久层框架.
IOC的底层实现原理
- IOC:Inversion of Control 控制反转. 指的是 对象的创建权反转(交给)给 Spring. 作用是实现了程序的解耦合.
- DI :Dependency Injection 依赖注入.需要有 IOC 的环境,Spring 创建这个类的过程中,Spring 将类的依赖的属性设置进去.
初学代码测试
编写相关的类
public class SpringTest {
public void say()
{
System.out.println("hello,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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="sayhello" class="cn.lcx.bean.SpringTest"></bean>
</beans>
编写测试代码
public class SpringDemo01 {
public static void main(String[] args) {
//加载spring配置文件,根据创建对象
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//得到配置创建的对象
SpringTest springTest =(SpringTest)context.getBean("sayhello") ;
System.out.println(springTest);
springTest.say();
}
}
控制台输出:
Spring 的相关配置
id 属性和 name,class 属性标签的配置
- id:给bean起个名字,在约束中采用id的规范:必须以字母开始,命名规则参考变量,不能出现特殊字符
- name:也是给bean起个名字,可以出现特殊字符,struts1的历史遗留
- class:创建对象所在类的全路径
scope 属性:Bean 的作用范围
- singleton:默认值,单例的.
- prototype:多实例
- request:WEB项目中,Spring创建一个Bean对象,放入request域中
- session:同上
- globalSession:应用在Portlet环境中,如果没有此环境,相当于session
- (了解)Portlet是基于Java的Web组件,由Portlet容器管理,并由容器处理请求,生产动态内容。Portals使用Portlets作为可插拔用户接口组件,提供信息系统的表示层。作为利用Servlets进行Web应用编程的下一步,Portlets实现了Web应用的模块化和用户中心化。 Portlet规范,即JSR(Java Standardization Request )168,是为了实现Portal和Portlet的互操作。它定义了Portlet和Portlet容器之间的合约,让Portlet实现个性化、表示和安全的API集。规范还定义了怎样在Portlets应用中打包Portlets。
Bean 的生命周期的配置
通过配置< bean >标签上的init-method作为Bean的初始化的时候执行的方法,配置destroy-method作为Bean 的销毁的时候执行的方法。
销毁方法想要执行,需要是单例创建的Bean 而且在工厂关闭的时候,Bean才会被销毁.
Spring 生成 Bean 的时候三种方式
无参数的构造方法的方式(常用)
<bean id="sayhello" class="cn.lcx.bean.SpringTest"></bean>
静态工厂实例化的方式
提供一个工厂类,创建静态的方法,返回类对象
public static Bean1 getBean1()
{
return new Bean1();
}
<bean id="bean1" class="cn.lcx.bean.BeanFactory1" factory-method="getBean1"></bean>
实例工厂实例化的方式
创建不是静态的方法,返回类对象
public Bean2 getBean2()
{
return new Bean2();
}
<bean id="bean2Factory" class="cn.lcx.bean.BeanFactory2"></bean>
<bean id="bean2" factory-bean="bean2Factory" factory-method="getBean2"></bean>
Spring 的 Bean 的属性注入
构造方法的属性注入
private String username;
public SpringTest(String username) {
this.username = username;
}
public void say()
{
System.out.println("hello,Spring!!"+username);
}
<bean id="demo" class="cn.lcx.bean.SpringTest">
<constructor-arg name="username" value="小溪"></constructor-arg>
</bean>
set 方法的方式注入属性
private String username;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public void say()
{
System.out.println("hello,Spring!!"+username);
}
<bean id="demo1" class="cn.lcx.bean.SpringTest">
<!--name:类里面定义的属性名称-->
<!--value:设置具体的值-->
<property name="username" value="小小溪"></property>
</bean>
注入对象类型属性
思路:
- 创建service类和dao类,在service得到dao对象
- 在service里面把dao作为类型属性,生成dao类型属性的set方法
public class UserService {
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void say()
{
System.out.println("service.....");
}
}
<bean id="userdao" class="cn.lcx.bean.UserDao"></bean>
<bean id="userservice" class="cn.lcx.bean.UserService">
<!--name:service类里面属性的值-->
<!--ref:dao配置bean标签中的id值-->
<property name="userDao" ref="userdao">
</property>
</bean>
注入复杂类型属性
数组
<property name="arrs">
<list>
<value>数组内容1</value>
<value>数组内容2</value>
<value>数组内容3</value>
</list>
</property>
list集合
<property name="list">
<list>
<value>list内容1</value>
<value>list内容2</value>
<value>list内容3</value>
</list>
</property>
map集合
<property name="map">
<map>
<entry key="aaa" value="111">
<entry key="bbb" value="222">
<entry key="ccc" value="333">
</map>
</property>
Properties 的注入
<property name="properties">
<props>
<prop key="username">root</prop>
<prop key="password">abc3770166</prop>
</props>
</property>