Spring注解
注解
Spring提供了一系列的注解来代替配置文件,简化配置
实际开发中,建议使用注解+配置的形式。
IOC注解
步骤
- 定义组件
- 扫包
<context:component-scan base-package="ioc"/>
<context:component-scan base-package="com.itany.aciton"/>
<context:component-scan base-package="com.itany.dao.impl"/>
<context:component-scan base-package="com.itany.service.impl"/>
组件的定义
- @Componet 定义Bean组件, 添加到ioc容器中,不区分组件类型。
- @Respsotiry 表示Dao组件
- @Service 表示Service组件
- @Controller 表示Action组件
数据的装配
注解类型的数据装配是使用属性进行注入,不是setter方法进行注入,所以可以没有setter方法。
- 注入
@Value("666")
private int number;
@Value("true")
private boolean falg;
@Value("${info.username}")
private String username;
@Value("java.lang.String")
private Class classzz;
@Value("classpath:ioc/spring.xml")
private Resource resource;
配置文件 info.properties
info.username=toms
xml
<!---扫包 -->
<context:component-scan base-package="ioc"/>
<context:component-scan base-package="com.itany.aciton"/>
<context:component-scan base-package="com.itany.dao.impl"/>
<context:component-scan base-package="com.itany.service.impl"/>
<!---读取配置文件 方法1 -->
<!-- <bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
<property name="location" value="info.properties"/>
</bean>-->
<!---读取属性文件方法2 -->
<context:property-placeholder location="info.properties"/>
生命周期
@PostConstruct
public void init()
{
System.out.println("初始化方法");
}
@PreDestroy
public void destory()
{
System.out.println("销毁之前执行的方法");
}
bean实例化时机
默认的时候容器启动的时候就初始化,加上@Lazy 就是调用该bean的时候再实例化
@Component
@Lazy
public class SpringBean {
@Value("666")
private int number;
}
作用域:
默认都是单例的,可在类上面配置@Scope来设置是否单例
@Scope("prototype")
AOP注解
基于注解方式定义切面
通知类:
@Component //加入IOC容器中
@Aspect //表示切面
public class logAdvice {
// 定义切点表达式
@Pointcut("execution(* aop.service.impl.*Impl.*(..))")
public void pc()
{
}
//前置通知
@Before("pc()")
public void before(JoinPoint point)
{
System.out.println("logAdvice.before.Method"+point.getSignature().getName());
}
//后置通知
@AfterReturning(value = "pc()",returning = "returnvalue")
public Object after(JoinPoint point,Object returnvalue)
{
System.out.println("后置通知:Method"+point.getSignature().getName()+"参数"+point.getArgs());
return returnvalue;
}
//异常通知
@AfterThrowing(value = "pc()",throwing ="e")
public void afterThrowing(JoinPoint joinPoint,Exception e)
{
System.out.println("logAdvice.afterThrowing:e:"+e);
}
//环绕通知
@Around("pc()")
public Object Around(ProceedingJoinPoint point)
{
Object proceed=null;
System.out.println("开始事务");
try
{
proceed=point.proceed();
System.out.println("提交事务");
}
catch (Throwable ex)
{
System.out.println("回滚事务");
}
return proceed;
}
}
配置文件
<!---扫包 -->
<context:component-scan base-package="aop.service.impl"/>
<context:component-scan base-package="aop.advice"/>
<!---自动创建代理并且织入切面 -->
<aop:aspectj-autoproxy/>
service及实现类
public interface UserService {
public void login(String username, String password) throws ClassNotFoundException;
public String logout();
}
@Service("userservice")
public class UserServiceImpl implements UserService {
@Override
public void login(String username, String password) {
/* int i=6/0;*/
System.out.println("username:"+username+"password:"+password);
}
@Override
public String logout() {
System.out.println("UserServiceImpl.logout");
return "bytebyte";
}
}
main:
ApplicationContext ac=new ClassPathXmlApplicationContext("aop/spring.xml");
UserService userService = (UserService) ac.getBean("userservice");
userService.logout();
try {
userService.login("张三","李四");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}