已经有xml文件配置了为什么还要用注解配置,因为用xml文件配置在项目庞大的情况下,类之间的耦合度会增高,用注解配置就会降低耦合度
注解都是配置在类上的
有哪些注解可以注入
@Component
是一个标准化的组件的注解,没有实际意义
@Repository
用于对DAO实现类的注解,数据持久层,只跟数据库互动
@Service
用于对业务层的注解
@Controller
用于对控制层的注解
Bean中必须要有一个无参的构造方法
Spring注解的命名机制:加注解的类的类名首字母小写就是Bean的名字
第一个通过注解配置的IOC例子
创建一个iocs.xml文件,用于扫描包,这个扫描的就是加入了注解的类的上级包
<context:component-scan base-package="com.longteng.lesson2.my.impl">
</context:component-scan>
创建一个类,类上加@Component注解,将该类加入容器中托管
这个是一个接口,被加入注解的类实现了该接口
public interface MyUserDao {
void addUserDao(String userName);
}
接口实现类,并且重写了抽象方法,在类上加了@Component注解,将该类生成Bean,加入Spring容器中托管
@Component
public class UserDao implements MyUserDao {
@Override
public void addUserDao(String userName) {
System.out.println(userName);
}
}
测试类,初始化方法添加xml文件启动容器,getBean的参数就是加入了@Component注解的类的类名首字母小写
public class Test {
ApplicationContext context;
@BeforeClass
public void beforeTest(){
context=new ClassPathXmlApplicationContext("iocs.xml");
}
@org.testng.annotations.Test
public void test1(){
MyUserDao myUserDao=(MyUserDao) context.getBean("userDao");
myUserDao.addUserDao("xx");
}
}
Spring通过注解如何实现回调方法
@PostConstruct(见名知意,在构造方法之后执行) 初始化方法的注解方式 等同与在XML中声明init-method=init
@PreDestroy(见名知意,销毁) 销毁方法的注解方式 等同于在XML中声明destory-method=destory
例:
接口类,一个业务方法,一个空init方法,一个空end方法
public interface MyUserDao {
void addUserDao(String userName);
void init();
void end();
}
接口实现类
重写接口类的业务方法,重写init方法,并将该方法定义为初始化方法,重写end方法,并将该方法定义为销毁方法
@Component
public class UserDao implements MyUserDao {
@Override
public void addUserDao(String userName) {
System.out.println(userName);
}
@Override
@PostConstruct
public void init(){
System.out.println("初始化方法");
}
@Override
@PreDestroy
public void end(){
System.out.println("销毁方法");
}
}
测试类启动容器,创建Bean,调用业务方法,初始化方法,销毁方法,初始化方法无论什么时候调用都是最早执行,销毁方法无论什么时候调用都是最后执行
public class Test {
ApplicationContext context;
@BeforeClass
public void beforeTest(){
context=new ClassPathXmlApplicationContext("iocs.xml");
}
@org.testng.annotations.Test
public void test1(){
MyUserDao myUserDao=(MyUserDao) context.getBean("userDao");
myUserDao.init();
myUserDao.addUserDao("xx");
myUserDao.end();
}
}
无论如何别忘了扫描包,要不然会找不到Bean
<context:component-scan base-package="com.longteng.lesson2.my.impl">
</context:component-scan>
@BeforeClass
@AfterClass
这两个注解是对于测试类中的启动容器而言,这两个是测试框架的内容,与Spring没关系
@PostConstruct
@PreDestroy
这两个注解是对于加入了@Component、@Repository、@Service、@Controller的注解中的初始化和销毁而言
@PostConstruct、@PreDestroy这两个注解与xml里的init-method、destroy-method是相同的