1.什么是注解
(1)注解是代码特殊标记,格式:@注解名称(属性名称=属性值,属性名称=属性值...)
(2)使用注解,注解可以作用在类上面,方法上面,属性上面
(3)使用注解的目的:简化xml配置
2.Spring针对Bean管理中创建对象提供的注解
(1)@Component 普通的组件,用它都可以创建对象
(2)@Service 建议使用在业务逻辑层Service层
(3)@Controller 建议使用在Web层
(4)@Repository 建议使用在DO层
*上面四个注解功能是一样的,都可以用来创建Bean实例,可以混用(service层可以用Controller注解...)
解的目的:简化xml配置
3.基于注解方式实现对象创建
第一步:引入依赖
第二步:开启组件扫描(告诉Spring容器现在那个类里面加了注解,Spring就会扫描这些类,指定扫描位置)
需要在Spring配置文件中使用context空间名称,然后使用context:component-scan标签
第三步:创建类,在类的上面加上注解
例如:
@Component() //也可以使用其他注解
若省略属性值不写,默认value值为类名首字母小写
@Component(value = "user001")
value相当于bean标签里面的id值
@Component(value = "user001")
public class UserService {
public void add(){
System.out.println("useradd...");
}
}
测试方法:
@Test
public void testCollection(){
//加载配置文件
ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
//通过反射获取对象
UserService user001 = context.getBean("user001", UserService.class);
System.out.println(user001);
user001.add();
}
开启扫描的细节问题:
(1)若直接引入包名,则Spring会扫描这个包下的所有类,查看是否有注解
(2)指定扫描内容(只扫描这个包下,包含Component注解的类)
use-default-filters="false":表示现在不使用默认filter,需要自己配置指定filter.
type=“annotation":表示按注解类型区分
expression="org.springframework.stereotype.Component":表示只扫描带Component注解的类
(3)指定不扫描的类(指定这个包下,不扫描包含Component注解的类)
4.基于注解方式实现属性注入
(1)Spring中针对属性注入的注解
@Autowired 根据属性类型进行自动装配注入(对象类型)
@Qualifier 根据名称进行注入(对象类型)
@Resource 可以根据属性类型注入,也可以根据名称注入(对象类型)
@Value 注入普通类型属性
使用@Autowired注解属性注入:
例:UserService类,UserDaoImp类
第一步:给两个类都加上创建对象的注解(四个任意一个)
第二步:给UserService类创建UserDaoImp属性,给Dao属性上添加@Autowired注解
UserService类:
@Component()
public class UserService {
@Autowired
private UserDao userDao;
public void add(){
System.out.println("useradd...");
userDao.add();
}
UserDaoImp类:
@Service
public class UserDaoImp implements UserDao {
@Override
public void add() {
System.out.println("dao add....");
}
}
UserDao接口:
public interface UserDao {
public void add();
}
使用@Qualifier注解属性注入:
要和@Autowired注解结合使用:
因为一个接口可能有多个类型的实现类,若只根据类型注入则找不到具体的实现类,集合对象名称进入注入
第一步:在UserDao类的创建对象注解中的给value设置属性值,也就是名称
第二步:在@Autowired下再加一个@Qualifier(名称)注解
使用@Resource注解属性注入:
*它是javax包下的,不是spring的,所以不建议使用,但是可以完成属性注入功能
@Resource //根据类型注入
@Resource(name="userDao001") //根据对象名称注入
使用@Value注解普通属性注入:
5.完全注解开发,用配置类替代xml配置文件
创建一个配置类:
@Configuration//作为配置配,替代xml配置文件
@ComponentScan(basePackages = {"practise"})//通过注解实现开启扫描
public class SpringConfig {
}
测试方法也要改变:
@Test
public void test02(){
//加载配置类
ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
//通过反射获取对象
UserService user001 = context.getBean("userService", UserService.class);
System.out.println(user001);
user001.add();
}