Spring-Bean管理基于注解方式

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注解普通属性注入:

Spring-Bean管理基于注解方式_第1张图片

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();

}

你可能感兴趣的:(Spring,spring,java,后端)