Spring注解方式

Spring注解方式

xml与注解合用

xml配置

<content:component-scan base-package="com.hello"/>

扫描back-package下的所有类对象

类注解

根据三层架构原则,spring定义了不同的注解,名称不同,但业务一样。

@Repository :持久层注解(注:当使用mybatis是使用mybatis本身的注解)

@Service :服务层注解

@controller:表现层注解

@Component:其他(不属于任何层,但需要加入到spring容器中是采用)注解

使用

在导入配置文件过后,使用Autowired注解自动注入

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:application.xml")
public class AppTest 
{
    @Autowired
    public UserService service;

    @Autowired
    public UserMapper mapper;

    @Test
    public void test1(){
        System.out.println(service);
        System.out.println(mapper);
    }

}

@Autowired注解

Autowired首先会按照类型去寻找根据找到的匹配对象分为三种情况:

1、未找到,默认报错

2、找到一个,注解注入

3、找到多个,再按名字寻找,若没有匹配,则报错,也可使用Qualifier("id")类型去找(注入接口,接口有多个实现类时,存在注入匹配到多个对象)

Autowired有一个require属性,默认true,当为true则必须注入对象,若为false,则有时注入,无时不管。

@Qualifier注解

在对类的类注解中设置id值

例:@Repository("id")

在Autowired的注解后可使用@Qualifier("id"),设置注入类的id,更进一步的精确注入对象。

@Primary注解

设置在类注解上,如:

@Service
@Primary
public class UserServiceImpl implements UserService {
}

在Autowired注解注入时,单或者多个时,默认注入带有Primary注解的类。

@Resource

Resource注解是jdk提供的注解,优先按照id属性注入,没有匹配,再按照类型注入,找到多个时会报错,不具备Autowired的require属性,不支持Primary注解。

纯注解

配置配置类

xml文件被配置类代替

配置类要配置两个注解,如:

@ComponentScan(basePackages = "com.hello")
@Configuration
public class UserConfig {
}

@ComponentScan(basePackages = "com.hello") 作用如

<content:component-scan base-package="com.hello"/>

@Configuration 注解表示当前类时spring的一个配置类。

注解这两个类后,这个配置类就可以看成一个xml文件。

javabean放入spring容器

如下,有两个Javabean类

public class Admin {
    private User user;
}
public class User {
}

@Component注解只能无参构造

若需要为对象属性赋值,可在config配置文件中如下配置

基本数据类型:

@Bean()
public User user(){
    return new User("12");
}

获取的User对象就是new User(“12”)

应用数据类型:

1、

@Bean
public Admin admin(){
    Admin admin = new Admin();
    admin.setUser(user());
    return admin;
}

直接调用setter方法设置属性值。

2、

@Bean
public Admin admin(User user){
    Admin admin = new Admin();
    admin.setUser(user);
    return admin;
}

传入的参数会自动的注入值

注:方法名就相当于xml文件bean标签中的id

单多例设置scope

单例,scope设置为singleton

@Scope(scopeName = ConfigurableBeanFactory.SCOPE_SINGLETON)
@Bean()
public User user(){
    return new User("12");
}

多例,scope设置为prototype

@Scope(scopeName = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
@Bean()
public User user(){
    return new User("12");
}

获取bean

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {UserConfig.class})
public class SpringTest {

    @Autowired
    public UserMapper user;

    @Test
    public void test(){
        System.out.println(user);
    }

}

测试类中的

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:application.xml")

换成了

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {UserConfig.class})
posted @ 2020-07-27 15:13  ygfcoder  阅读(287)  评论(0)    收藏  举报