spring-一些需要技巧
引入properties文件
写命名空间
xmlns:context="http://www.springframework.org/schema/context" http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd
然后配置一个标签就可以用了
<context:property-placeholder location="classpath:jdbc.properties"/>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
开启扫描注解
<context:component-scan base-package="com.smu.controller"/>
对于AOP
aspectjweaver包含aspectjrt,所以我们只需要引入aspectjweaver依赖包就可以了
五种通知类型
<aspect>方式
<bean id="user" class="com.smu.service.User"/> <!--自定义的增强类--> <bean id="myAdvice" class="com.smu.advice.MyAdvice"/> <aop:config> <!--配置execution表达式,表示需要增求的方法--> <aop:pointcut id="mypointcut" expression="execution(* com.smu.service.User.show())"/> <!--配置增强方法所在的类--> <aop:aspect ref="myAdvice"> <!--配置在方法前执行或者后面或者环绕执行,以及需要引用的表达式即需要对哪些方法增强--> <!--方法名为需要执行的方法--> <aop:before method="before" pointcut-ref="mypointcut"/> </aop:aspect> </aop:config>
<advicor>方式
需要自定义类实现借助Advice接口的子接口
execution表达式
execution([访问修饰符] 返回值类型 包名.类名.方法名(参数))
- 访问修饰符可以不写
- 返回值类型,某一级包名,类名,方法名,可以使用**表示任意
- 包名与类名之间使用.表示该包下的类,使用..表示该包及其子包下的类
- 参数列表可以使用..表示任意参数
通过方法入参定义切点
切点表达式中的方法入参部分比较复杂,可以使用*和..通配符。 其中 *表示任意参数类型的参数, 而..表示任意类型的参数且参数个数不限。
execution(* joke(String,int))
匹配joke(String,int)方法,且joke方法的第一个入参是String,第二个入参是int。 比如 匹配 SmartSeller#joke(String ,int)方法。 如果方法中的入参类型是java.lang包下的,这可以直接使用类名,否则必须使用全限定类名,比如 joke(java.util.List,int)
execution(* joke(String,*))
匹配目标类中的joke()方法,该方法第一个入参为String,第二个入参为任意类型。 比如 joke(String s1, String s2)和joke(String s1,double d)都匹配,但是 joke(String s1, String s2,double d3)不匹配。
execution(* joke(String,..))
匹配目标类中的joke方法,该方法的第一个入参为String,后面可以有任意个入参且入参类型不限。 比如 joke(String s1),joke(String s1,String s2)和joke(String s1,double d2,String s3)都匹配。
execution(* joke(Object+))
匹配目标类中的joke()方法,方法拥有一个入参,且入参是Object类型或该类的子类。 它匹配joke(String s1) 和joke(Client c) . 如果定义的切点是execution(* joke(Object)) ,则只匹配joke(Object object)而不匹配joke(String s1) 或者joke(Client c)。
.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了