j2EE spring(IOC)

j2EE spring(IOC)

核心容器:核心容器提供 Spring 框架的基本功能。核心容器的主要组件是 BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转 (IOC) 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。

Spring 上下文:Spring 上下文是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。

Spring AOP: 通过配置管理特性,Spring AOP 模块直接将面向方面的编程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何对象支持 AOP。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖 EJB 组件,就可以将声明性事务管理集成到应用程序中。

Spring DAO:JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写 的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。

Spring ORM:Spring 框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。

Spring Web 模块:Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。所以,Spring 框架支持与 Jakarta Struts 的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。

Spring MVC 框架:MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现。通过策略接口,MVC 框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText 和 POI。



依赖注入、控制反转

依赖注入:在运行期,由外部容器动态地将依赖对象注入到组件中

控制反转:应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部窗口负责得。这样控制权就由应用转移到了外部容器,控制权的转移就是所谓的反转。]

spring

控制反转/依赖注入---面向切入编程---与主流框架的整合

Example

j2EE spring(IOC)

beans.xml

 <bean id="u" class="com.bjsxt.dao.impl.UserDAOImpl">
  </bean>

  <bean id="ud" class="com.bjsxt.dao.impl.UserDAOImpl2">
  </bean>

  <bean id="userService" class="com.bjsxt.service.UserService">
  	<property name="userDAO" ref="u" />  		
  </bean>

test.java

ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
UserService service = (UserService)ctx.getBean("userService");
User u = new User();
u.setUsername("zhangsan");
u.setPassword("zhangsan");
service.add(u);


作用域

singleton:返回bean 的同一个实例,也是默认的作用域(无状态bean使用此作用域)

prototype:每次请求都会创建一个实例(有状态bean 使用此作用域)

request、session、global session 这三个作用域主要用在web 应用中

生命周期

初始化

当scope=singleton,即默认情况,会在装载配置文件时实例化。如果希望在调用getBean时才初始化,可以使用lazy-init="true" 补充:如果希望希望该配置文件中的所有bean都延迟初始化,则应在beans根结点中使用lazy-init="true"。当scope=prototype 时,在调用getBean()方法时才会初始化。

构造器、init 方法、获取bean 后的操作、destroy 方法(ctx.close、注意如果bean 的scope设为prototype 时,当ctx.close 时

  <bean id="ud" class="com.bjsxt.dao.impl.UserDAOImpl2">

  </bean>


  <bean id="userService" class="com.bjsxt.service.UserService">

  <property name="userDAO" ref="u" />

  </bean>

,destroy 方法不会被调用)

注入(XML配置)

属性注入

在相应的字段上一定要有setter 方法,才能注入

<bean id="userServiceBean" class="com.asm.service.UserServiceBean">
<property name="id" value="10"></property>
<property name="username" value="张某某"></property>
</bean>

  <bean id="u" class="com.bjsxt.dao.impl.UserDAOImpl2">
  </bean>
  <bean id="userService" class="com.bjsxt.service.UserService">
  	<property name="userDAO" ref="u" />
  </bean>

集合注入

 <bean name="userDAO" class="com.bjsxt.dao.impl.UserDAOImpl">
  	<property name="sets">
  		<set>
  			<value>1</value>
  			<value>2</value>
  		</set>
  	</property>
  	<property name="lists">
  		<list>
  			<value>1</value>
  			<value>2</value>
  			<value>3</value>
  		</list>
  	</property>
  	<property name="maps">
  		<map>
  			<entry key="1" value="1"></entry>
  			<entry key="2" value="2"></entry>
  			<entry key="3" value="3"></entry>
  			<entry key="4" value="4"></entry>
  		</map>
  	</property>
  </bean>

public class UserDAOImpl implements UserDAO {
	/* (non-Javadoc)
	 * @see com.bjsxt.dao.UserDAO#save(com.bjsxt.model.User)
	 */
	private Set<String> sets;
	private List<String> lists;
	private Map<String , String> maps;

初始化与销毁函数的注入

  <bean id="userService" class="com.bjsxt.service.UserService" init-method="init" destroy-method="destroy" scope="singleton">
  	<!-- 
  	<property name="userDAO" ref="u" />
  	 -->
  	 <constructor-arg>
  	 	<ref bean="u"/>
  	 </constructor-arg>
  </bean>


构造函数的注入

<bean id="userServiceBean2" class="com.asm.service.UserServiceBean">
    <constructor-arg index="0" value="李某某"/>
    <constructor-arg index="1" ref="userDaoImpl" />
    <constructor-arg index="2">
    <list>
        <value>List值一</value>
        <value>List值二</value>
        <value>List值三</value>
    </list>
    </constructor-arg>
</bean>

publicUserServiceBean(String username, UserDao userDao, Set<String> set)
{
    this.username=username;
    this.userDao=userDao;
    this.set=set;
}

注解

开启注解功能

<?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-2.5.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.5.xsd">
	<context:annotation-config /> 

</beans>

 @Autowired注解规则

可以省略get与set方法

bytype

默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false,如:@Autowired(required=false) .如果我们想使用名称装配可以结合 @Qualifier注解进行使用;

public class UserService {
	@Autowired
	@Qualifier("u2")
	private UserDAO userDAO;  

	public void add(User user) {
		userDAO.save(user);
	}
}

@resource

默认安装名称进行装配,名称可以通过name属性进行指定,如果没有指定name属性,当注解写在字段上时,默认取字段名进行安装名称查找,如果注解写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装 配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。

	@Resource
	public void setUserDAO( UserDAO userDAO) {
		this.userDAO = userDAO;
	}
	
	@Resource(name=“”)
	public void setUserDAO( UserDAO userDAO) {
		this.userDAO = userDAO;
	}

如果将@requied或者@autowired写了set方法之上,则程序会走到set方法内部。但如果写在了field之上,则不会进入set方法当中。

@component

在beans下面

<context:annotation-config />
<context:component-scan base-package="com.bjsxt"/>//指定自动管理的包名

在类中

@Component("u") 
public class UserDAOImpl implements UserDAO {
	public void save(User user) {
		System.out.println("user saved!");
	}
}

@comnonent的效果:相当于在xml中beans下面定义了bean的配置

@service (业务层组件)、@controller(控制层组件)、@repository功能类似

@Component("userService1")
public class UserService {
	
	private UserDAO userDAO;  
	@Resource(name="u")
	public void setUserDAO( UserDAO userDAO) {
		this.userDAO = userDAO;
	}
	@PostConstruct
	public void init() {
		System.out.println("init");
	}
	@PreDestroy
	public void destroy() {
		System.out.println("destroy");
	}	

首先先加载ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");即 读beans.xml里面的内容,然后通过

<context:component-scan base-package="com.bjsxt"/>找从com.bjsxt开始“scan”含@component的类

@Component("userService1")找到后就初始化对象,在初始化对象的时候遇到了@Resource(name="u"),继续寻找有@Component("u")的注解

second example

packagecom.asm.service;

@Service("usb") /如果使用Service这些注解时不指定名称,这些实例bean的名称就是类名(但首字母小写)
@Scope("singleton")
public class UserServiceBean {
    @Resource(name = "userDaoImpl")
    private UserDao userDao;
    private UserDao userDao2;
    
    @Autowired(required = true)
    @Qualifier("userDaoImpl")
    private UserDao userDao3;
    
    @Resource
    public void setUserDao2(UserDao userDao2) {
        this.userDao2 = userDao2;
    }
    
    publicUserServiceBean() {
    }
    
    @PostConstruct
    public void init() {
        System.out.println("init method is called");
    }
    
    public void test() {
        System.out.println("********************************");
        userDao.save();
        userDao2.save();
        System.out.println(userDao3);
        // userDao3.save();
        System.out.println("********************************");
    }
}







你可能感兴趣的:(spring,J2EE,IOC)