Spring 注解总结

@Component注解

默认注入的bean的id属性值为类名首字符小写
也可以在注入的时候指定id值

@Component()
public class BeanAnnotation {

    public void say(){
        System.out.println("SAY SOMETHING!");
    }
}
 BeanAnnotation annotation = (BeanAnnotation) applicationContext1.getBean("beanAnnotation");
        annotation.say();

@Required注解

适用于bean属性的setter方法

表示该属性配置时必须被填充

public class BeanAnnotation {

    private String name;

    @Required
    public void setName(String name) {
        this.name = name;
    }

    public void say(){
        System.out.println("SAY SOMETHING!");
    }
}
 <bean id="beanAnnotation" class="bean.annotation.BeanAnnotation">
        <property name="name" value="heqianqian"/>
    </bean>
 BeanAnnotation annotation = (BeanAnnotation) applicationContext1.getBean("beanAnnotation");
        annotation.say();

否则会报错

Caused by: org.springframework.beans.factory.BeanInitializationException: Property 'name' is required for bean 'beanAnnotation'CapableBeanFactory.java:553)
    ... 11 more

@Autowired注解

自动装配
可以用于bean的setter方法,构造器,构造函数

1.用在Field上

@Repository
public class AutoWiredDao {

    public void say(){
        System.out.println("Autowired....");
    }
}
@Service
public class AutoWiredServiceImpl implements AutoWiredService {

    @Autowired//加在bean上
    private AutoWiredDao autoWiredDao;

    @Override
    public void say() {
        autoWiredDao.say();
    }
}

2.加在setter方法上

@Autowired//加在setter方法上
    public void setAutoWiredDao(AutoWiredDao autoWiredDao) {
        this.autoWiredDao = autoWiredDao;
    }

3.加在构造函数上

@Autowired//加在constructor上
    public AutoWiredServiceImpl(AutoWiredDao autoWiredDao) {
        this.autoWiredDao = autoWiredDao;
    }

4.加在List上 把对象放入List
5.加在Map上 把Id和对象放入Map

使用@Oreder进行排序 只对List有效

/**
 * BeanInterface
 * 测试@Autowired注解List,Map,Set
 * Created by heqianqian on 2017/4/25.
 */
public interface BeanInterface {
}
/**
 * BeanImplOne
 * 测试@Autowired注解List,Map,Set
 * Created by heqianqian on 2017/4/25.
 */
@Order(2)
@Component
public class BeanImplOne implements BeanInterface {
}
/**
 * BeanImplTwo
 * 测试@Autowired注解List,Map,Set
 * Created by heqianqian on 2017/4/25.
 */
@Order(1)
@Component
public class BeanImplTwo implements BeanInterface {
}
@Component
public class BeanInvoker {

    @Autowired
    private List<BeanInterface> beanInterfaceList;

    @Autowired
    private Map<String, BeanInterface> beanInterfaceMap;

    public void autowireList() {
        System.out.println("===autowireList===");
        if (null != beanInterfaceList) {
            for (BeanInterface beanInterface : beanInterfaceList) {
                System.out.println(beanInterface.getClass().getName());
            }
        } else {
            System.out.println("beanInterfaceList is null");
        }
    }

    public void autowireMap() {
        System.out.println("===autowireMap===");
        if (null != beanInterfaceMap) {
            for (Map.Entry<String, BeanInterface> beanInterfaceEntry : beanInterfaceMap.entrySet()) {
                System.out.println(beanInterfaceEntry.getKey() + " " + beanInterfaceEntry.getValue().getClass().getName());
            }
        } else {
            System.out.println("beanInterfaceMap is null");
        }
    }
}
 BeanInvoker beanInvoker = (BeanInvoker) applicationContext1.getBean("beanInvoker");
        beanInvoker.autowireList();
        beanInvoker.autowireMap();

输出结果

===autowireList===  
bean.annotation.BeanImplTwo
bean.annotation.BeanImplOne
===autowireMap===
beanImplOne bean.annotation.BeanImplOne
beanImplTwo bean.annotation.BeanImplTwo

@Qualifier注解

按类型装配多个可能bean实例的情况,可以缩小范围或者指定唯一bean,也可以用于指定构造器参数或者方法参数

可以注解集合类型变量

 @Autowired
    @Qualifier("beanImplOne")
    private BeanInterface beanInterface;
  public void qualifier(){
        System.out.println("===qualifier===");
        if (beanInterface!=null){
            System.out.println(beanInterface.getClass().getName());
        }
    }

@Bean注解

@Bean+@Configuration

用于配置和初始化一个由SpringIoC容器管理的新对象的方法,类似于XML配置文件的<bean/>

@Configuration
public class AppConfig {

    @Bean
    public AutoWiredService myService(){
        return new AutoWiredServiceImpl();
    }
}

等同于在XML文件中配置

<bean id="myService" class="bean.annotation.AutoWiredServiceImpl"/>

bean没有指定name时默认id是方法的名称

@Bean+@Scope

@Bean默认的单例模式Singleton

使用@Scope的value属性指定作用域(singleton,prototype,request,session,global session)

proxyMode指定代理方式

@ImportResource,@PropertyResource和@Value注解

一般引入配置文件的方式

<context:property-placeholder location="classpath:jdbc.properties"/>

    <bean id="myDriverManager" class="bean.annotation.MyDriverManager">
        <property name="url" value="${url}"/>
        <property name="driver" value="${driver}"/>
        <property name="username" value="${username}"/>
        <property name="password" value="${password}"/>
    </bean>
url=jdbc:mysql://localhost:3306/pro_manage
driver=com.mysql.jdbc.Driver
username=root
password=root

使用注解引入配置文件的方法

public class MyDriverManager {

    public MyDriverManager(String url, String driver, String username, String pwd) {
        System.out.println("url:" + url);
        System.out.println("driver:" + driver);
        System.out.println("username:" + username);
        System.out.println("pwd:" + pwd);
    }
}
@Configuration
@PropertySource("classpath:jdbc.properties")
public class AppConfig {

    @Value("${url}")
    private String url;

    @Value("${driver}")
    private String driver;

    @Value("${username}")
    private String username;

    @Value("${password}")
    private String password;

    @Bean
    public MyDriverManager myDriverManager() {
        return new MyDriverManager(url, driver, username, password);
    }

}
MyDriverManager myDriverManager = (MyDriverManager) applicationContext1.getBean("myDriverManager");
        System.out.println(myDriverManager.getClass().getName());

输入结果

Loading XML bean definitions from class path resource [application-anno.xml]
url:jdbc:mysql://localhost:3306/pro_manage
driver:com.mysql.jdbc.Driver
username:heqianqian
pwd:root
===init StringStore===
Disconnected from the target VM, address: '127.0.0.1:53370', transport: 'socket'
bean.annotation.MyDriverManager

这里出现一个小问题

输入的username和配置文件的username不同 这里取到的是当前操作系统的用户名 所以建议修改配置文件 改成 数据库驱动.username的形式

jdbc.url=jdbc:mysql://localhost:3306/pro_manage
jdbc.driver=com.mysql.jdbc.Driver
jdbc.username=root
jdbc.password=root

这样打印出来的结果就是正确的了

Loading XML bean definitions from class path resource [application-anno.xml]
url:jdbc:mysql://localhost:3306/pro_manage
driver:com.mysql.jdbc.Driver
username:root
pwd:root
===init StringStore===
bean.annotation.MyDriverManager

@Resource和@PostConstruct,@PreDestroy

没有显示指定name默认从属性名和setter方法得出

@Repository
public class ResouceDao {

    public void save() {
        System.out.println("ResouceDao Save");
    }

    @PostConstruct
    public void init() {
        System.out.println("ResouceDao Init");
    }

    @PreDestroy
    public void destroy() {
        System.out.println("ResouceDao Destroy");
    }
}
@Service
public class ResourceService {

    @Resource
    private ResouceDao resouceDao;

    //@Resource
    //public void setResouceDao(ResouceDao resouceDao) {
    //    this.resouceDao = resouceDao;
    //}

    public void save() {
        resouceDao.save();
    }
}
        ResourceService resourceService = (ResourceService) applicationContext1.getBean("resourceService");
        resourceService.save();

JSR330

首先引入jar包

<dependency>
   <groupId>javax.inject</groupId>
    <artifactId>javax.inject</artifactId>
    <version>1</version>
</dependency>

@Inject

等同于@AutoWired
可以用于构造器,Setters和类

@Named

与@Component等效


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值