概述

  本文主要讲的是如何使用Java Bean来配置Spring,而不是用xml来配置Spring。

  本文主要是代码,需要注意的都在注释里面。

  代码打包下载地址(注:项目使用Maven构建)


Java配置Spring

 package com.wisely.highlight_spring4.ch1.javaconfig;

 /**
* 最终被调用的类
*/
public class FunctionService {
public String sayHello(String word){
return "Hello " + word +" !";
}
}
 package com.wisely.highlight_spring4.ch1.javaconfig;

 /**
* 调用类
*/
public class UseFunctionService {
//这里也可以使用@Autowired将FunctionService的实体bean注入到UseFunctionService中,
//让UseFunctionService具备将FunctionService的实体bean注入到UseFunctionService中的功能
//@Autowired
FunctionService functionService; public void setFunctionService(FunctionService functionService) {
this.functionService = functionService;
} public String SayHello(String word){
return functionService.sayHello(word);
}
}
 package com.wisely.highlight_spring4.ch1.javaconfig;

 import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; /**
* 配置类,代替xml配置
*/
//声明当前类是一个配置类
@Configuration
//自动扫描包名下所有使用@Service/@Component/@Repository和@Controller的类,并注册为Bean
//@ComponentScan("com.wisely.highlight_spring4.ch1")
public class JavaConfig {
/**
* 声明当前方法的返回值是一个bean,bean的名称是方法名
* @return bean
*/
@Bean
public FunctionService functionService(){
return new FunctionService();
} @Bean
public UseFunctionService useFunctionService(){
UseFunctionService useFunctionService = new UseFunctionService();
//注入FunctionService的时候直接调用functionService
useFunctionService.setFunctionService(functionService()); //
return useFunctionService; }
/**
* 也可以将bean作为方法参数传入,spring会自动注入
*/
// @Bean
// public UseFunctionService useFunctionService(FunctionService functionService){//4
// UseFunctionService useFunctionService = new UseFunctionService();
// useFunctionService.setFunctionService(functionService);
// return useFunctionService;
// }
}
 package com.wisely.highlight_spring4.ch1.javaconfig;

 import org.springframework.context.annotation.AnnotationConfigApplicationContext;

 /**
* 程序入口
*/
public class Main {
public static void main(String[] args) {
//使用AnnotationConfigApplicationContext作为容器,
//接受输入一个配置类作为参数
AnnotationConfigApplicationContext context =
new AnnotationConfigApplicationContext(JavaConfig.class);
//获得声明配置的UseFunctionService的Bean
UseFunctionService useFunctionService = context.getBean(UseFunctionService.class);
//调用输出方法
System.out.println(useFunctionService.SayHello("java config"));
context.close();
}
}

  最终效果如下所示

Java配置AOP

 package com.wisely.highlight_spring4.ch1.aop;

 import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; /**
* 拦截规则的注解
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Action {
//注解参数
String name();
}
 package com.wisely.highlight_spring4.ch1.aop;

 import org.springframework.stereotype.Service;

 /**
* 使用注解的被拦截类
*/
@Service
public class DemoAnnotationService {
@Action(name="注解式拦截的add操作")
public void add(){}
}
 package com.wisely.highlight_spring4.ch1.aop;

 import org.springframework.stereotype.Service;

 /**
* 使用方法规则被拦截类
*/
@Service
public class DemoMethodService {
public void add(){}
}
 package com.wisely.highlight_spring4.ch1.aop;

 import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component; import java.lang.reflect.Method; /**
* 配置切面
*/
@Aspect //声明切面
@Component //让切面成为spring容器管理的bean
public class LogAspect {
//声明切点,拦截Action
@Pointcut("@annotation(com.wisely.highlight_spring4.ch1.aop.Action)")
public void annotationPointCut() {
} //声明建言,并使用@Pointcut定义的切点annotationPointCut()
@After("annotationPointCut()")
public void after(JoinPoint joinPoint) {
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
Action action = method.getAnnotation(Action.class);
//通过反射获可得注解上的name属性,然后做日志记录相关的操作
System.out.println("注解式拦截 " + action.name());
} //声明建言,直接使用拦截规则作为参数
@Before("execution(* com.wisely.highlight_spring4.ch1.aop.DemoMethodService.*(..))")
public void before(JoinPoint joinPoint) {
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
System.out.println("方法规则式拦截," + method.getName());
}
}
 package com.wisely.highlight_spring4.ch1.aop;

 import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy; /**
* Spring配置类,因为程序中使用了诸如@Service之类的配置,所以这里不用写其他配置
* 只需要使用@ComponentScan扫描一下就可以了
*/
@Configuration
//扫描注解,注册bean
@ComponentScan("com.wisely.highlight_spring4.ch1.aop")
//开启spring对AspectJ的支持
@EnableAspectJAutoProxy //
public class AopConfig { }
 package com.wisely.highlight_spring4.ch1.aop;

 import org.springframework.context.annotation.AnnotationConfigApplicationContext;

 /**
* 程序入口
*/
public class Main {
public static void main(String[] args) {
AnnotationConfigApplicationContext context =
new AnnotationConfigApplicationContext(AopConfig.class);
DemoAnnotationService demoAnnotationService = context.getBean(DemoAnnotationService.class);
DemoMethodService demoMethodService = context.getBean(DemoMethodService.class);
demoAnnotationService.add();
demoMethodService.add();
context.close();
}
}

  最终效果如下所示

Java方式配置Spring的更多相关文章

  1. Java方式配置Spring MVC

    概述 使用Java方式配置Spring MVC,以及回顾一下Spring MVC的各种用法. Spring MVC简述 关于Spring MVC的介绍网上有很多,这里就不再赘述了,只是要说一下,Spr ...

  2. 如何用Java类配置Spring MVC(不通过web.xml和XML方式)

    DispatcherServlet是Spring MVC的核心,按照传统方式, 需要把它配置到web.xml中. 我个人比较不喜欢XML配置方式, XML看起来太累, 冗长繁琐. 还好借助于Servl ...

  3. bean的自动装配,使用注解开发,使用java的方式配置Spring

    bean的自动装配 自动装配是Spring满足bean依赖一种方式! Spring会在上下文中自动寻找,并自动给bean装配属性! 在Spring中有三种装配的方式 在xml中显示的配置 在java中 ...

  4. SSH深度历险(十) AOP原理及相关概念学习+AspectJ注解方式配置spring AOP

    AOP(Aspect Oriented Programming),是面向切面编程的技术.AOP基于IoC基础,是对OOP的有益补充. AOP之所以能得到广泛应用,主要是因为它将应用系统拆分分了2个部分 ...

  5. 纯java config配置Spring MVC实例

    1.首先创建一个Maven工程,项目结构如下: pom.xml添加Spring和servlet依赖,配置如下 <project xmlns="http://maven.apache.o ...

  6. 使用java类的方式配置spring 需要什么注解?

    1.@Configuration 修饰类,声明当前类是一个配置类,相当于applicationContext.xml文件 2.@ComponentScan 用于指定spring在初始化容器时要扫描的包 ...

  7. spring java 方式配置JedisPool Bean

    来自一个开源项目https://git.oschina.net/geek_qi/ace-cache package com.ace.cache.config; import com.ace.cache ...

  8. MyBatis 及 MyBatis Plus 纯注解方式配置(Spring Boot + Postgresql)

    说明 当前的版本为 MyBatis 3.5.9 MyBatis Plus 3.5.1 Spring Boot 2.6.4 Postgresql 42.3.3 与 Spring Boot 结合使用 My ...

  9. 纯注解方式配置spring+springMVC

    1.新建类initConfig,继承AbstractAnnotationConfigDispatcherServletInitializer,并重写getRootConfigClasses().get ...

随机推荐

  1. js获取浏览器宽高、网页宽高、屏幕宽高、鼠标位置等(带图片说明)

    网页可见区域宽: document.body.clientWidth;网页可见区域高: document.body.clientHeight;(点击查看大图) 网页可见区域宽: document.bo ...

  2. Normalize.css 与传统的 CSS Reset 有哪些区别?

    CSS Reset 是革命党,CSS Reset 里最激进那一派提倡不管你小子有用没用,通通给我脱了那身衣服,凭什么你 body 出生就穿一圈 margin,凭什么你姓 h 的比别人吃得胖,凭什么你 ...

  3. Nginx基本配置和作用

    nginx可以重新加载文件的.我们直接运行:nginx -s reload 配置文件有没有问题,可以直接输入:nginx -t nginx -s stop就可以关闭 但有时我们就不想它挂的时候访问另外 ...

  4. POJ3061 Subsequence

    Subsequence Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 16520   Accepted: 7008 Desc ...

  5. MSTAR GUI

    1.架构 WIN32 SDK ACT->CTL->API->GE/GOP ACT: Customized logic parts CTL: Behavior widgets API: ...

  6. Nagios监控Windows的网卡流量

    Nagios监控Windows的网卡流量 使用/usr/local/nagios/libexec/中的check_traffic.sh,不但可以监控Linux的网卡流量,也可以监控Windows服务器 ...

  7. 动态规划专题 01背包问题详解 HDU 2546 饭卡

    我以此题为例,详细分析01背包问题,希望该题能够为大家对01背包问题的理解有所帮助,对这篇博文有什么问题可以向我提问,一同进步^_^ 饭卡 Time Limit: 5000/1000 MS (Java ...

  8. React-Native 基本环境的搭建

    看了一些RN资料,仅仅了解到人们对 RN(以下简称 React_native 框架) 的使用描述以及评价,就觉得RN是一个很不错的框架,值得学习.今天就开始写我的学习记录,也给大家分享一下.下面进入正 ...

  9. 有关如何线程安全的使用map(hashMap)

    最近在写一个多线程中控制输出顺序的系统中的一个代码,使用了map的数据结构.具体的业务是需要一个单例的对象,然后需要在多线程的环境下实现添加和删除的操作.部分代码如下: public class Up ...

  10. Coding WebIDE 开放支持第三方 Git 仓库

    为了给开发者提供更多便捷的开发方式,Coding.net 现正式宣布 WebIDE 开放啦 ! 用户可以自由选择各大代码托管平台,推送代码到其它家代码仓库啦,同时新版的 WebIDE 还有如下特性: ...