java <bean id="user1" class="pojo.User"></bean>
xml <bean id="user2" class="pojo.User">??? <property name="id" value="2"></property>??? <property name="username" value="李四"></property></bean>
xml <bean id="user3" class="pojo.User">??? <constructor-arg value="1"> </constructor-arg>?? <constructor-arg value="张三"> </constructor-arg></bean>
xml <bean id="user5" class="factory.Dfactory" factory-method="b"></bean>
普通工厂方法
xml <bean id="c" class="factory.Dfactory"></bean><bean id="user4" factory-bean="c" factory-method="a"></bean>
普通方法
<!--外部注入-->
<bean id="userDao" class="com.Spring.dao.impl.UserDaoImpl">
</bean>
<bean id="userService" class="com.Spring.service.impl.UserServiceImpl">???
<property name="userDao" ref="userDao"></property></bean>
<bean id="userAction" class="com.Spring.controller.UserAction">???
<property name="userService" ref="userService"></property></bean>
xml <!--内部注入--> <bean id="userAction" class="com.Spring.controller.UserAction">??? <property name="userService">????? <bean class="com.Spring.service.impl.UserServiceImpl">???????? <property name="userDao">?????? <bean class="com.Spring.dao.impl.UserDaoImpl"> </bean>??????????? </property>??????? </bean>??? </property> </bean>
xmlns:p="http://www.springframework.org/schema/p"
<!--p命名空间注入-->
<bean id="userDao" class="com.Spring.dao.impl.UserDaoImpl"> </bean>
<bean id="userService" class="com.Spring.service.impl.UserServiceImpl" p:userDao-ref="userDao"></bean>
<bean id="userAction" class="com.Spring.controller.UserAction" p:userService-ref="userService"></bean>
xml ?<!--自动装配 byName -->? <bean id="userDao" class="com.Spring.dao.impl.UserDaoImpl"></bean>??? <bean id="userService" class="com.Spring.service.impl.UserServiceImpl" autowire="byName"></bean>??? <bean id="userAction" class="com.Spring.controller.UserAction" autowire="byName"></bean>
xml <!--自动装配 byType --> <bean id="userDao" class="com.Spring.dao.impl.UserDaoImpl"> </bean> <bean id="userService" class="com.Spring.service.impl.UserServiceImpl" autowire="byType"> </bean> <bean id="userAction" class="com.Spring.controller.UserAction" autowire="byType"></bean>
需要环境: 帮助文档搜索xmlns:context
xmlns:context="http://www.springframework.org/schema/context"
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
java package com.Spring.test; /** * @Author Jamin <br> * @Date 2019/3/26 15:43 <br> * @Description 接口 */public interface SALE {? String sale(int money);}
实现类
java package com.Spring.test; /** * @Author Jamin <br> * @Date 2019/3/26 15:44 <br> * @Description * 目标对象 * */ public class Apple{? public String sale(int money) {?????? return "卖苹果手机";? }}
package com.Spring.test;
/**
* @Author Jamin <br>
* @Date 2019/3/26 15:47 <br>
* @Description
*
*
* 静态代理
*/
public class AppleProxy implements SALE {
private Apple apple = new Apple();
public AppleProxy(Apple apple) {
this.apple = apple;
}
@Override
public String sale(int money) {
String s=apple.sale(money);
String a="买手机送手机壳";
return s+a;
}
}
package com.Spring.test;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* @Author Jamin <br>
* @Date 2019/3/26 16:19 <br>
* @Description
*/
public class SaleFactory {
private Object o;
public SaleFactory(Object o) {
this.o = o;
}
public Object factory() {
return Proxy.newProxyInstance(
o.getClass().getClassLoader(),
o.getClass().getInterfaces(),
new InvocationHandler() {
/**
*
* @param proxy 被代理的对象
* @param method 要调用的方法
* @param args 方法调用时所需要的参数
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("aaaaaaaaaaaaaaa");
Object invoke = method.invoke(o, args);
System.out.println("bbbbbbbbbbbbbbb");
return invoke;
}
});
}
}
Cglib代理 子类代理
```java
package com.Spring.test;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
/**public Cglib(Object o) {
this.o = o;
}
public Object getProxy() {
Enhancer en = new Enhancer();
en.setSuperclass(o.getClass());
en.setCallback(this);
return en.create();
}
@Override
public Object intercept(Object obj, Method method, Object[] objects, MethodProxy methodProxy)
throws Throwable {
System.out.println("aaaaaaaaaaaaa");
Object invoke = method.invoke(o, objects);
System.out.println("bbbbbbbbbbbb");
return invoke;
}
}
xml <!--创建目标对象--> <bean id="empServiceImpl" class="com.spring.EmpService.EmpServiceImpl"></bean> <!--创建代理对象--> <bean id="empAop" class="com.spring.aop.EmpAop"></bean> <!--将对象织入目标对象中--> <aop:config> <!--配置切入点--> <aop:pointcut id="pt" expression="execution(* com.spring.EmpService.EmpServiceImpl.*())"></aop:pointcut> <!--指定通知--> <aop:aspect ref="empAop"> <aop:before method="getBefore" pointcut-ref="pt"></aop:before> <aop:after method="getAfter" pointcut-ref="pt"></aop:after> <aop:around method="getRound" pointcut-ref="pt"></aop:around> <aop:after-returning method="getReturn" pointcut-ref="pt"></aop:after-returning> <aop:after-throwing method="getThrowable" pointcut-ref="pt"></aop:after-throwing> </aop:aspect> </aop:config>
方法
```java
package com.spring.aop;
import org.aspectj.lang.ProceedingJoinPoint;
/**
* @Author Jamin <br>
* @Date 2019/3/27 10:22 <br>
* @Description
*/
public class EmpAop {
/** 前置通知 */
public void getBefore() {
System.out.println("前置通知");
}
/*后置通知*/
public void getAfter() {
System.out.println("后置通知");
}
/*环绕通知*/
public Object getRound(ProceedingJoinPoint pj) throws Throwable {
System.out.println("环绕通知前");
Object proceed = pj.proceed();
System.out.println("环绕通知后");
return proceed;
}
/*返回通知*/
public void getReturn() {
System.out.println("返回通知");
}
/*异常通知*/
public void getThrowable() {
System.out.println("异常通知");
}
}
```配置文件
<!--创建目标对象-->
<bean id="empServiceImpl" class="com.spring.EmpService.EmpServiceImpl"></bean>
<!--创建代理对象-->
<bean id="empAop2" class="com.spring.aop.EmpAop2"></bean>
<!--开启自动代理-->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
方法
package com.spring.aop;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.core.annotation.Order;
/**
* @Author Jamin <br>
* @Date 2019/3/27 14:02 <br>
* @Description
*/
@Aspect
public class EmpAop2 {
@Pointcut("execution(* com.spring.EmpService.EmpServiceImpl.*())")
public void pointCut() {}
/** 前置通知 */
@Before("pointCut()")
public void getBefore() {
System.out.println("前置通知");
}
/*返回通知*/
@AfterReturning("pointCut()")
public void getReturn() {
System.out.println("返回通知");
}
/*后置通知*/
@After("pointCut()")
public void getAfter() {
System.out.println("后置通知");
}
/*环绕通知*/
@Order(2)
@Around("pointCut()")
public Object getRound(ProceedingJoinPoint pj) throws Throwable {
System.out.println("环绕通知前");
Object proceed = pj.proceed();
System.out.println("环绕通知后");
return proceed;
}
/*异常通知*/
@AfterThrowing("pointCut()")
public void getThrowable() {
System.out.println("异常通知");
}
}
xml <!-- 定义事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSources"/> </bean> <!--配置事务通知--> <tx:advice id="txadvice" transaction-manager="transactionManager"> <!--事务操作--> <tx:attributes> <tx:method name="account*"/> </tx:attributes> </tx:advice> <!--切面配置--> <aop:config> <!--切入点service层的实现方法--> <aop:pointcut id="pt" expression="execution(* com.springmvc.*())"/> <!--切面--> <aop:advisor advice-ref="txadvice" pointcut-ref="pt"></aop:advisor> </aop:config>
注解
<!-- 定义事务管理器 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSources"/>
</bean>
<!--开启注解事务管理-->
<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
<!--在需要事务管理的方法上添加注解 @Transactional-->
原文:https://www.cnblogs.com/JaminYe/p/10630720.html