Using Spring from Scratch

1. IOC - Inversion of Control 控制反转

IOC的基本概念是:不创建对象,但是描述创建它们的方式。在代码中不直接与对象和服务连接,但在配置文件中描述哪一个组件需要哪一项服务。容器负责将这些联系在一起。

2. AOP - Aspect Oriented Programming

意为:面向切面编程(也叫面向方面),可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可以说也是这种目标的一种实现。

对业务逻辑的各个部分进行隔离, 从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

3. 加载

3.1 FileSystemXmlApplicationContext

ApplicationContext context = new FileSystemXmlApplicationContext(
				new String[] { "src/services.xml" });

3.2 ClassPathXmlApplicationContext

ApplicationContext context = new ClassPathXmlApplicationContext(
		        new String[] {"services.xml"});

4. 配置文件 service里调用dao

<?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-2.5.xsd">

  <bean id="userService" class="com.sam.service.UserService" lazy-init="true">
    <property name="userDao" ref="userDao" />
  </bean>
  
    <bean id="userDao" class="com.sam.dao.UserDaoImpl2">
    <!-- collaborators and configuration for this bean go here -->
  </bean>
  
  <!-- more bean definitions go here -->
</beans>

5. Annotation @命令的自动提示


6. Spring anotation的配置

配置文件(service中的dao不再需要setter,getter方法):

<?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/>

     
	<bean id="userService" class="com.sam.service.UserService"></bean>
	<import resource="daos.xml" />
</beans>
   

类:

package com.sam.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

import com.sam.dao.UserDao;

public class UserService {
	
	@Autowired

	public UserDao userDao;	
	
	public void save() {
		System.out.println("UserService saved!");
		
		userDao.save();
	}
}

7. Classpath scanning for managed components 零配置:

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-2.5.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.5.xsd">
	<context:component-scan base-package="com.sam" />

</beans>

 DAO:

package com.sam.dao;

import org.springframework.stereotype.Repository;

@Repository

public class UserDao {
	public void save() {
		System.out.println("UserDao saved!");
	}
}

 Service:

package com.sam.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.sam.dao.UserDao;

@Service

public class UserService {
	
	@Autowired
	public UserDao userDao;	
	
	public void save() {
		System.out.println("UserService saved!");		
		userDao.save();
	}
}
 

8. PropertyEditors

好像蛮重要的,有空看一下

9. Chapter 6. Aspect Oriented Programming with Spring

AOP的注解的配置:

<?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"
	xmlns:aop="http://www.springframework.org/schema/aop"
	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
           http://www.springframework.org/schema/aop
           http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
	<context:annotation-config />
	<context:component-scan base-package="com.sam" />
	<aop:aspectj-autoproxy/>
</beans>

Java类的配置:

package com.sam.aop;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class LogInterceptor{	
	@Before("execution(public void com.sam.dao.UserDaoImpl2.userSaved())")
	public void beforeMethod() {
		System.out.println("m started.");
	}
}

 第一次运行报错,缺少类,加入如下3个包解决问题:

Spring_lib_with_dependency\aspectj\aspectjrt.jar

Spring_lib_with_dependency\aspectj\aspectjweaver.jar

Spring_lib_with_dependency\aopalliance\aopalliance.jar

类继承了接口,可以自动由jdk的InvocationHandler来实现代理。

类没有接口,需要加入cglib来实现。

AOP 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"
	xmlns:aop="http://www.springframework.org/schema/aop"
	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
           http://www.springframework.org/schema/aop
           http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
	<context:annotation-config />
	<context:component-scan base-package="com.sam" />
	<bean id="logInterceptor" class="com.sam.aop.LogInterceptor" />
	<aop:config>
		<aop:pointcut expression="execution(public * com.sam.service..*.userSaved(..))"
			id="servicePointcut" />
		<aop:aspect id="logAspect" ref="logInterceptor">
			<aop:before method="beforeMethod" pointcut-ref="servicePointcut" />
		</aop:aspect>
	</aop:config>
</beans>

10. 配置datasource

    方式一: 直接写连接信息,用户名密码

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>
    <property name="url" value="jdbc:sqlserver://localhost:1433;DatabaseName=db"/>
    <property name="username" value="sam"/>
    <property name="password" value="sam"/>
</bean>
 

    方式二: 配JNDI

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
   <!-- websphere -->
        <property name="jndiName" value="java:comp/env/jdbc/samproject" />
      <!--tomcat -->
        <property name="jndiName" value="jdbc/samproject" />
       
    </bean>

  在tomcat的service.xml配置

<Context docBase="samproject" path="/samproject" reloadable="true" debug="5" crossContext="true"
          source="org.eclipse.jst.j2ee.server:samproject">
      <Resource name="jdbc/samproject"
        auth="Container"
        type="javax.sql.DataSource"
        driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
        url="jdbc:sqlserver://localhost:1433;DatabaseName=db"
        username="sam"
        password="sam"
        maxActive="100"      
        maxIdle="30"      
        maxWait="10000" />      
      </Context>
    </Host>
 

11. 事务管理

<bean id="transactionManager"
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource" />
	</bean>


	<tx:advice id="txAdvice" transaction-manager="transactionManager">
		<tx:attributes>
			<tx:method name="insert*" propagation="REQUIRED"
				rollback-for="java.lang.Exception" />
			<tx:method name="delete*" propagation="REQUIRED"
				rollback-for="java.lang.Exception" />
			<tx:method name="update*" propagation="REQUIRED"
				rollback-for="java.lang.Exception" />
			<tx:method name="*" read-only="false"/>
		</tx:attributes>
	</tx:advice>



	<aop:config>
		<aop:pointcut id="serviceMethod"
			expression="execution(* com.sam.service..*.*(..))" />
		<aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethod" />
	</aop:config>
 

最后保留行

猜你喜欢

转载自samsongbest.iteye.com/blog/1423610