Spring(一)------实现IOC

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配置文件实现,注入属性使用注解实现

 

猜你喜欢

转载自blog.csdn.net/wangdongli_1993/article/details/81226063