注解的配置和xml配置所达到的目的都是一样的,都是为了降低程序间的耦合。不同的只是配置形式不同。看自己个人喜好哪种配置方法
一、注解配置
这里按注解的目的进行一定的划分
创建对象的注解
@Component
作用于组件上面,将资源交给spring来管理。
属性:value可以指定这个bean的id。
对于@Conponent注解,spring做了一些细致的划分。针对于三层架构的设计模式,细分为以下三个注解
-
@Controller 表现层
-
@Service 业务层
-
@Resposity 持久层
注入数据的注解
spring中提供了两个注入的注解
- @Autowired
@Autowired是按类型自动转配的,不支持id匹配,当有两个或以上满足类型的bean,则会发生
UnsatisfiedDependencyException异常,容器不知道要注入哪一个满足条件的bean
可以结合Qualifier注解对匹配类型的baen进行id注入
-
@Qualifier
在自动按照类型注入的基础之上,再按照Bean的id注入。它在给字段注入时不能独立使用,必须和@Autowire一起使用;但是给方法参数注入时,可以独立使用。
-
@Resource
二合一注解来了,可以按照类型也可以按照beanid。默认是按照类型进行注入
-
@Value
注入基本数据类型和 String 类型数据的
作用范围的注解
可以指定bean的作用范围
//service注解会将当前类交给spring容器,默认的id值才用的是驼峰命名法
@Service
@Scope()//默认是单例模式 prototype是多例模式
public class MyServiceImpl implements MyService {
@Autowired//自动导入 默认是按照ByType的方式进行注入
@Qualifier("Impl1") //当该类型存在多个实现类时,需要加@Qualifier 声明实现类的id 不能单独使用,配合@Autowired使用
//@Resource(type = MyDaoImpl1.class) //
/* 默认按着类型注入
@Resource //name 是按着id注入
*
* */
private MyDao myDao;
@Override
public void register() {
myDao.save(" myDao方法");
}
@PostConstruct
public void init(){
System.out.println("init method invoke");
}
@PreDestroy
public void destory(){
System.out.println("destory method invoke");
}
}
如上面的代码配置,注解@Service将这个类讲给spring容器,同时@Scope定义了这个bean的生命周期(最主要的还是bean的加载时机),@Autowired注解将标注的对象自动注入的这个bean中。当标注的接口有多个实现类的时候,就需要配合Qualifier一起使用了
生命周期的注解
就如上面代码中两个方法标注的注解
- @PostConstruct
指定标注的方法为初始化方法
- @PreDestory
指定标注的方法为销毁方法
纯注解开发的注解
纯注解实现的spring代码–待编写
- @Configuration
标明当前类是可以替代AppicationContext.xml文件的
- @ComponentScan
用于指定spring在初始化容器时要扫描的包。作用和在spring的xml配置文件中的:
-
@PropertySource
用于加载.properties文件中的配置。例如我们配置数据源时,可以把连接数据库的信息写到properties配置文件中,就可以使用此注解指定properties配置文件的位置。
-
@Import
用于导入其他配置类,在引入其他配置类时,其他类上可以不用再写@Configuration注解。
- @Bean
作用与方法上,将方法的返回值作为一个bean,并交给spring管理
/*
* @Configuration 标明当前类是可以替代AppicationContext.xml文件的
* @ComponentScan("com.gx") 扫描的包名及包下的类
* */
@Configuration
@ComponentScan("com.gx")
@PropertySource("db33.properties")
public class ApplicationConfig {
//引入第三方jao包 将这个类交给spring容器
//Bean注解将方法的返回值放在springBean容器中
//Bean的id默认就是方法的名称
@Bean
public Date createDate() {
return new Date();
}
}
二、代码使用上述注解(注解的形式)
spring的配置文件:applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<!--<bean id="myServiceImpl" class="com.gx.service.MyServiceImpl.MyServiceImpl"></bean>-->
<!--加载注解的解析器-->
<!-- 告知spring扫描包,并对注解进行解析-->
<!-- spring会扫描当前包以及子包下的注解-->
<context:component-scan base-package="com.gx"></context:component-scan>
<!-- 可以对配置文件进行简单的加载-->
<context:property-placeholder location="db22.properties"></context:property-placeholder>
</beans>
编写Dao接口及接口的两个实现类:
public interface MyDao {
public void save(String name);
}
//实现类1
@Repository("Impl1")
public class MyDaoImpl1 implements MyDao {
public void save(String name) {
System.out.println("MyDaoImpl1 save method invoke"+name);
}
}
//实现类2
@Repository("Impl2")
public class MyDaoImpl2 implements MyDao {
public void save(String name) {
System.out.println("MyDaoImpl2 save method invoke"+name);
}
}
编写Service接口及实现了
public interface MyService {
public void register();
}
//service注解会将当前类交给spring容器,默认的id值才用的是驼峰命名法
@Service
@Scope()//默认是单例模式 prototype是多例模式
public class MyServiceImpl implements MyService {
@Autowired//自动导入 默认是按照ByType的方式进行注入
@Qualifier("Impl1") //当该类型存在多个实现类时,需要加@Qualifier 声明实现类的id 不能单独使用,配合@Autowired使用
//@Resource(type = MyDaoImpl1.class) //
/* 默认按着类型注入
@Resource //name 是按着id注入
*
* */
private MyDao myDao;
@Override
public void register() {
myDao.save(" myDao方法");
}
@PostConstruct
public void init(){
System.out.println("init method invoke");
}
@PreDestroy
public void destory(){
System.out.println("destory method invoke");
}
}
测试配置文件读取
db22.properties配置文件:
username=aaaaaaa
classname=bbbbbbb
url=ccccccccc
pass=123123123
读取配置文件的小测试
@Repository("Impl4")
public class MyDaoImpl implements MyDao {
@Value("${url}")
private String userName;
public void save(String name) {
System.out.println("配置文件中properties的值"+userName);
System.out.println("MyDaoImpl1 save method invoke"+name);
}
public String getUserName() {
return userName;
}
}