目录
3.并分别说明有哪些特点 Spring配置AOP有哪几种方式?
1.Spring实现依赖注入有哪几种方式
-
构造方法注入(Constructor Injection):通过构造方法将依赖项传递给目标对象。可以使用
<constructor-arg>
元素或者@Autowired
注解配合构造方法来实现。 -
-
Setter方法注入(Setter Injection):通过Setter方法为依赖项提供设置方法,然后在配置文件中使用
<property>
元素或者@Autowired
注解进行注入。 -
-
注解注入(Annotation injection):直接在目标对象的字段上使用
@Autowired
注解进行依赖注入。这种方式需要注意字段的可见性,通常应该将字段声明为私有,并提供公共的访问方法。 -
-
p命名注入(现在基本不适用了):直接在目标bean上即使使用p命名的方式直接给bean注入数据
-
如果使用p命名空间来注入bean的话只需要在属性后添加ref即可
2.Spring有哪些增强类型?
-
前置通知(Before Advice):在目标方法执行之前执行的增强。可以在方法执行前进行一些准备工作或者参数验证。
-
-
后置通知(After Advice):在目标方法执行之后执行的增强,无论目标方法是否抛出异常。可以利用后置通知来完成一些资源清理、日志记录等操作。
-
-
返回通知(After Returning Advice):在目标方法成功执行并返回结果后执行的增强。可以获取到目标方法的返回值并进行相关处理。
-
-
异常通知(After Throwing Advice):在目标方法抛出异常后执行的增强。可以捕获目标方法抛出的异常,并根据需要进行相应的处理。
-
-
环绕通知(Around Advice):在目标方法执行前后都可以执行的增强。环绕通知具有最大的灵活性,可以完全控制目标方法的执行过程,包括在目标方法执行前后进行自定义的逻辑处理。
-
package com.cskt.aspect; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.*; @Aspect public class MyAspect { //前置增强 方法前面 执行 后置增强 环绕增强 异常增强 最终增强 //切面 Aspect Advice beforeAdvice pointCut // 给那个方法增强 。。。。。, @Before("execution( * com.cskt.pojo..*.*(..))") public void before(){ System.out.println("前置通知.... 在方法之前要執行的公共代码放在这里"); } /** * 后置通知 * returnVal,切点方法执行后的返回值 */ @AfterReturning(value="execution(* com.cskt.pojo..*.*(..)))",returning = "returnVal") public void AfterReturning(Object returnVal){ System.out.println("后置通知...."+returnVal ); } /** * 环绕通知 * @param joinPoint 可用于执行切点的类 * 具体什么业务 * @return * @throws Throwable */ @Around("execution(* com.cskt.pojo..*.*(..))") public Object around(ProceedingJoinPoint joinPoint) throws Throwable { System.out.println("环绕通知前...."); Object obj= (Object) joinPoint.proceed(); System.out.println("环绕通知后...."); return obj; } /** * 抛出通知 * @param e */ @AfterThrowing(value="execution(* com.cskt.pojo..*.*(..))",throwing = "e") public void afterThrowable(Throwable e){ System.out.println("出现异常:msg="+e.getMessage()); } /** * 无论什么情况下都会执行的方法 */ @After(value="execution(* com.cskt.pojo..*.*(..))") public void after(){ //方法的对象的关闭 //方法的回滚 System.out.println("最终通知...."); } }
3.并分别说明有哪些特点 Spring配置AOP有哪几种方式?
-
基于XML的配置:使用XML配置文件来定义切面、切点和增强逻辑。通过
<aop:config>
元素来进行AOP配置,包括定义切面和切点,以及将切面和切点与目标对象关联起来。 -
基于注解的配置:使用注解来定义切面、切点和增强逻辑。通过在切面类上添加
@Aspect
注解,切点方法上添加@Pointcut
注解,以及在增强方法上添加@Before
、@After
、@Around
等注解来实现AOP的配置。同时,可以通过在配置类上添加@EnableAspectJAutoProxy
注解来启用自动代理功能。 -
使用Java配置类:通过使用Java配置类来定义切面、切点和增强逻辑。使用
@Configuration
注解标记配置类,通过在配置类中定义@Bean
方法来创建切面对象,并使用@EnableAspectJAutoProxy
注解开启自动代理功能。
4.什么是Spring的纯注解开发
Spring的纯注解开发是指在使用Spring框架进行应用开发时,完全依赖注解而不使用任何XML配置文件的开发方式。通过注解来配置和管理Bean、依赖注入、AOP等功能。
在传统的Spring开发中,我们需要在XML配置文件中定义Bean、配置依赖关系、事务管理、AOP切面等内容。而纯注解开发则将这些配置信息以注解的方式直接写在Java类中,使得开发更加简洁、灵活,并且能够更好地利用Java编译器进行静态检查。
在纯注解开发中,常用的注解包括:
@Component
:用于标识一个普通的Bean组件。@Controller
:用于标识一个控制器类。@Service
:用于标识一个服务类。@Repository
:用于标识一个数据访问类(如DAO)。@Autowired
:用于进行依赖注入,将其他Bean注入到当前Bean中。@Qualifier
:用于指定具体的注入对象,解决多个同类型Bean的注入歧义性问题。@Value
:用于注入属性值。@RequestMapping
:用于映射URL路径和控制器方法的关系。@Aspect
:用于定义切面类,实现AOP功能。@Transactional
:用于标识事务处理方法。
5.不同数据类型的注入方法
-
普通类型注入:使用
<value>
标签或@Value
注解配合集合格式的值进行注入。- XML配置方式:
<bean id="exampleBean" class="com.example.ExampleBean"> <property name="setProperty"><value>value1</value> </property> </bean>
- 注解方式:
public class ExampleBean { @Value("111") private String setProperty; // ... }
- XML配置方式:
-
List注入:使用
<list>
标签或@Value
注解配合列表格式的值进行注入。- XML配置方式:
<bean id="exampleBean" class="com.example.ExampleBean"> <property name="listProperty"> <list> <value>value1</value> <value>value2</value> <value>value3</value> </list> </property> </bean>
- 注解方式:
public class ExampleBean { @Value("${my.list}") private List<String> listProperty; // ... }
- XML配置方式:
-
Set注入:使用
<set>
标签或@Value
注解配合集合格式的值进行注入。- XML配置方式:
<bean id="exampleBean" class="com.example.ExampleBean"> <property name="setProperty"> <set> <value>value1</value> <value>value2</value> <value>value3</value> </set> </property> </bean>
- 注解方式:
java复制代码
public class ExampleBean { @Value("${my.set}") private Set<String> setProperty; // ... }
- XML配置方式:
-
properties注入:使用
<
property
>
标签或@P
roperty
注解配合集合格式的值进行注入。-
XML配置方式:使用
<context:property-placeholder>
标签来加载属性文件,并通过${...}
占位符引用属性值。xml复制代码
<bean id="exampleBean" class="com.example.ExampleBean"> <property name="property1" value="${my.property1}" /> <property name="property2" value="${my.property2}" /> </bean>
-
注解方式:使用
@Value
注解来注入属性值。java复制代码
public class ExampleBean { @Value("${my.property1}") private String property1; @Value("${my.property2}") private int property2; // ... }
-
Java配置类方式:通过使用
@PropertySource
注解来加载属性文件,并使用@Value
注解注入属性值。java复制代码
@Configuration @PropertySource("classpath:config.properties") public class AppConfig { @Value("${my.property1}") private String property1; @Value("${my.property2}") private int property2; // ... }
-
-
Map注入:使用
<map>
标签或@Value
注解配合键值对格式的值进行注入。- XML配置方式:
xml复制代码
<bean id="exampleBean" class="com.example.ExampleBean"> <property name="mapProperty"> <map> <entry key="key1" value="value1"/> <entry key="key2" value="value2"/> <entry key="key3" value="value3"/> </map> </property> </bean>
- 注解方式:
java复制代码
public class ExampleBean { @Value("#{${my.map}}") private Map<String, String> mapProperty; // ... }
- XML配置方式:
6.纯注解开发怎么完成
1.编写配置bean的java类
2.使用注解配置bean
3.使用注解自动装配
如果有报错或者 运行显示没有找到,是因为自动装配是根据名称去找的,会根据变量名称去找的,我们可以归到名称或类型指定装配
4.扫描注解配置包
Spring纯注解开发配置类
package config;
import org.springframework.context.annotation.*;
@Configuration//表示配置文件类
@ComponentScan({"pojo","aop","mapper","config","service"})//扫描配置类
@PropertySource("database.properties")//配置属性元
@EnableAspectJAutoProxy
@Import({jdbcConfig.class,myBatisConfig.class})//导入配置类
public class SpringConfig {
}
5.使用注解连接jdbc
配饰文件导入properties
package config;
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import javax.sql.DataSource;
public class jdbcConfig {
//1.定义一个方法获取要管理的对象
//2.添加@Bean,表示当前方法的返回值是一个bean
@Value("${jdbc.driver}")
private String driver;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
@Bean
public DataSource dataSource(){
DruidDataSource ds=new DruidDataSource();
ds.setDriverClassName(driver);
ds.setUrl(url);
ds.setUsername(username);
ds.setPassword(password);
return ds;
}
}
6.编写测试类