Spring
一站式框架,action调用service,service调用dao。
整合web项目原理
(1)加载spring核心配置文件
- new对象:ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
能实现,效率慢
(2)实现思想
把配置文件的加载和对象的创建的过程,在服务器启动时完成
(3)实现原理
- ServletContext对象
在服务器启动的时候,会为每个项目创建一个ServletContext对象
- 监听器ServletContextListenter接口
在创建ServletContext对象时候,使用监听器,知道什么时候创建
然后就加载spring配置文件,紧接着创建对象
把创建的对象放到ServletContext中,setAttribute()方法
获取对象getAttribute()方法
Spring bean管理(xml实现)
IOC控制反转,不通过new来创建对象,而是通过spring配置文件或者注解来创建对象,也叫spring的bean管理
bean标签的参数值
id:标识
class:对象所属类的完整路径
name:与id一直,允许特殊符号
scope:对象的作用域,默认单例。singleton单例的,prototype多实例的
首先配置myeclipse的spring环境,导入jar包
(1)bean实例化三种方式
- 使用类的无参数构造方法
类中没有构造方法默认无参构造,添加有参数构造方法那就一定要加无参构造
package xidian.lili.bean;
public class User {
public void add(){
System.out.println("add......");
}
}
<?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="user" class="xidian.lili.bean.User">
</bean>
</beans>
package xidian.lili.bean;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestIoc {
@Test
public void testUser(){
//加载spring配置文件
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
User user=(User) context.getBean("user");
user.add();
}
}
- 使用静态工厂创建
package xidian.lili.bean;
public class UserFactory {
public static User getUser(){
return new User();
}
}
<bean id="UserFactory" class="xidian.lili.bean.UserFactory" factory-method="getUser">
</bean>
- 使用实例工厂
package xidian.lili.bean;
public class UserFactory {
public User getUser(){
return new User();
}
}
<bean id="UserFactory2" class="xidian.lili.bean.UserFactory2">
</bean>
<bean id="user" factory-bean="UserFactory2" factory-method="getUser">
</bean>
(二)属性注入
java:(1)有参数构造器注入属性(2)set方法注入(3)接口注入
spring框架能实现前两种注入
-
spring 构造方法注入
<bean id="user" class="xidian.lili.bean.User">
<constructor-arg index="0" value="lili"></constructor-arg>
<constructor-arg index="1" value="1"></constructor-arg>
</bean>
-
spring set方法注入
<bean id="user" class="xidian.lili.bean.User">
<property name="name" value="夏娃"></property>
<property name="id" value="1"></property>
</bean>
-
Spring注入引用类型属性
package xidian.lili.service;
import xidian.lili.bean.User;
public class UserService {
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
<bean id="user" class="xidian.lili.bean.User">
<property name="name" value="夏娃"></property>
<property name="id" value="1"></property>
</bean>
<bean id="userservice" class="xidian.lili.service.UserService">
<property name="user" ref="user"></property>
</bean>
-
spring使用p名称空间注入
<?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.xsd">
<bean id="user" class="xidian.lili.bean.User" p:name="亚当" p:id="2">
</bean>
-
spring注入复杂类型属性(数组,list,map)
<bean id="user" class="xidian.lili.bean.User">
<!-- 注入数组属性-->
<property name="arr">
<list>
<value>lili</value>
<value>tgtd</value>
</list>
</property>
<!-- 注入list属性-->
<property name="list">
<list>
<value>ww</value>
<value>qq</value>
</list>
</property>
<!-- 注入map属性-->
<property name="map">
<map>
<entry key="1" value="a"></entry>
<entry key="2" value="b"></entry>
</map>
</property>
</bean>
IOC和DI的区别
DI:依赖注入,向类里面的属性设置值
IOC:利用spring创建对象
关系:先IOC,才能DI,先有对象才能创建属性
Spring bean管理(注解实现)
(1)导入jar包
(2)创建bean类
(3)编写spring配置文件,引入新的约束(较上面来说)开启注解扫描
<!-- 开启注解扫描 -->
<!-- 多个bean包 -->
<context:component-scan base-package="xidian.lili"></context:component-scan>
<context:component-scan base-package="xidian.lili.anno1,xidian.lili.anno2"></context:component-scan>
<!-- 扫描类,属性方法的注解 -->
<context:component-scan base-package="xidian.lili.anno"></context:component-scan>
<!-- 扫描属性的注解 -->
<context:annotation-config></context:annotation-config>
(1)注解创建对象
在对象的类上使用注解
然后读取配置文件,按照注解的value来创建对象,与前面一样
有四个创建对象的注解,用法一样,只是为了区别方法位置
@Component(value="user")
@Service(value="user") 业务层
@Controller(value="user") web层
@Repository(value="user") 持久层
注解实现对象堆单例的还是多例的
(2)注解注入属性(以引用对象属性为例)
1.为属性加注解@Autowired
根据属性前修饰的类名来找到类创建对象
package xidian.lili.anno;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component(value="userservice")
public class UserService {
@Autowired
private User user;
public void add(){
user.add();
System.out.println("service_add......");
}
}
package xidian.lili.anno;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
@Component(value="user")
public class User {
public void add(){
System.out.println("user_add......");
}
}
2.为属性加注解@Resourse
package xidian.lili.anno;
import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component("userservice")
public class UserService {
//@Autowired//根据属性前的类名创建
@Resource(name="user")//这个根据User类的注解后面的值来创建
private User user;
public void add(){
user.add();
System.out.println("ser_add......");
}
}
Spring bean管理总结
xml配置文件实现和注解实现混合使用,创建对象采用xml配置文件实现,注入属性使用注解实现