1、什么是注解
(1)注解是代码特殊标记 格式:@注解名称(属性名称=属性值,属性名称=属性值…)
(2)使用注解 注解作用在类上面 方法上面 属性上面
(3)使用注解的目的:简化xml配置
2、Spring针对Bean管理创建提供了四种注解
(1)@Component
(2)@Service
(3) @Controller
(4)@Repository
上面四个注解功能一样 都可以用来bean实例
3基于注解创建对象方式
第一步:引入依赖 引入spring-aop的依赖
第二部:开启组件扫描
<context:component-scan base-package="context"></context:component-scan>
第三步 创建类 在类上添加创建对象注解
//在注解里面 value属性值可以省略不写 默认值是类名称 首字母小写 userService
@Component(userService )
public class UserService {
public void add(){
System.out.println("ssss");
}
}
开启组件扫描细节问题,扫描哪些类 哪些不需要扫描
示例一 根据context:include-filter 设置扫描那些内容
<!-- 开启组件扫描 如多扫描多个包第一种方法用逗号隔开 或者扫描多个包的上层目录包-->
<context:component-scan base-package="context" use-default-filters="false">
<!-- 示例一 use-default-filters="false" 表示不使用默认filters扫描全部 自己配置filters
根据context:include-filter 设置扫描那些内容-->
<context:include-filter type="annotation" expression="org.springframework.stereotype.Component"/>
</context:component-scan>
示例二:根据context:exclude-filter 设置不扫描那些内容
<context:component-scan base-package="context" >
<!-- 示例二:根据context:exclude-filter 设置不扫描那些内容-->
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>
</context:component-scan>
基于注解方式实现属性注入
(1)@AutoWired:根据属性类型进行自动装配
第一步:把service和dao对象创建,在service和dao类添加创建对象注解
第二步:在service注入dao对象,在service类添加dao类型属性,在属性上面使用注解
//在注解里面 value属性值可以省略不写 默认值是类名称 首字母小写 userService
//userservice类
@Component
public class UserService {
//定义Dao类型属性 然后在属性上面加上注解Autowired
//不需要添加set方法
@Autowired
private UserDao userDao;
public void add(){
System.out.println("userService");
userDao.add();
}
}
//接口类
@Component
public interface UserDao {
public void add();
}
//接口实现类
@Service
public class UserDaoImpl implements UserDao {
public void add() {
System.out.println("userdao");
}
}
(2)@Qualifier:根据属性名称进行注入
这个@Qualifier注解的使用要和上面的@Autowired一起使用
//userservice类
@Component
public class UserService {
//定义Dao类型属性 然后在属性上面加上注解Autowired
//不需要添加set方法
@Autowired
@Qualifier(value = "userDaoImpl1")
private UserDao userDao;
public void add(){
System.out.println("userService");
userDao.add();
}
}
接口实现类
一个接口可以有多个实现类 根据类型注入不知道需要去找那个 所以可以取名 根据名称来进行注入
@Service(value = "userDaoImpl1") //一个接口可以有多个实现类 根据类型注入不知道需要去找那个 所以可以取名 根据名称来进行注入
public class UserDaoImpl implements UserDao {
public void add() {
System.out.println("userdao");
}
}
(3)@Resource:可以根据类型注入,也可以根据名称注入 是javax包里的 并不是spring包中的
//@Resource 根据类型进行注入
@Resource(name = "userDaoImpl1")
注:前三个是根据对象类型进行注入
(4)@Value:注入普通类型属性
@Value(value = "zhangsan")
private String name;
纯注解开发
注:在spring中作为了解 ,一般用在springBoot开发中
(1)创建配置类 ,替代xml配置文件
@Configuration //代表配置类,替代xml文件
@ComponentScan(basePackages = {"context"}) //组件扫描
public class SpringConfig {
}
(2)编写测试类(测试类有点不一样)
@Test
public void userservice(){
//加载配置类
ApplicationContext context=new AnnotationConfigApplicationContext(SpringConfig.class);
UserService emp = context.getBean("userService", UserService.class);
System.out.println(emp);
emp.add();
}