潍坊企业免费建站新软件推广平台
目录
1.Bean基本注解开发
@Component
@Score@lazy
@PostConstruct和@PreDestroy
@Repository@Service@Controller
2.Bean依赖注入注解开发
@Value
@Autowired
@Qualifier
@Resource
扩展AutoWired
1.Bean基本注解开发
基本Bean注解,主要是使用注释的方式替代原有xml的
<bean>
标签及其标签属性的配置<bean id=" " name="" class="" scope="" lazy-init="" init-method="" destroy-method="" abstract="" autowire="" factory-bean="" factory-method=""></bean>
@Component
使用注解替代
<bean>
标签//Component注解 必须写类上面 可以起别名(没有起别名默认类名小写)
被该注解标识的类,会在指定扫描范围内被spring加载并实例化
使用步骤1,更改配置文件的头添加注解 2.添加扫描
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd "><!--spring需要通过注解的方式将类放到spring容器中 需要配置一个标签 context 告诉spring容器去哪里扫描注解--> <!-- 告诉spring容器将那个包下具有注解的类放置spring容器中--><context:component-scan base-package="com.rocky"></context:component-scan></beans>
@Component("user") public class User {private Integer id;private String uname;private String password; }
@Score@lazy
@PostConstruct和@PreDestroy
<!-- https://mvnrepository.com/artifact/javax.annotation/javax.annotation-api --> 需要引入依赖 <dependency><groupId>javax.annotation</groupId><artifactId>javax.annotation-api</artifactId><version>1.3.2</version> </dependency>
@PostConstructpublic void init(){System.out.println("init User");}@PreDestroypublic void destroy(){System.out.println("destroy user");}
@Repository@Service@Controller
由于JavaEE开发是分层的,为了每层Bean标识的注解语义化更加明确,@Component又衍生出如下三个注解:
2.Bean依赖注入注解开发
Bean依赖注入的注解,主要是使用注解的方式替代XML的
<property>
标签完成属性的注入操作<bean id="" class=""><property name="" value=""></property><property name="" ref=""></property></bean>
@Value
@Component public class User {@Value(value = "zhangsan")private String name;@Value("20")private int age;@Value("李四")public void setName(String name) {this.name = name;}public User(@Value("隔壁老王") String name, @Value("33") int age) {this.name = name;this.age = age;}
@Value注解可以出现在属性上、setter方法上、以及构造方法的形参上
@Autowired
Autowired注解可以用来注入非简单类型。单独使用@Autowired注解,默认根据类型装配。
@Autowired根据类型注入
//如果有多个实现了接口的对象,那么我们必须和bean的参数名称匹配
//传递的参数和bean名称(id一致)@Autowired // 在属性上注入private UserDao userDao;@Autowiredpublic void setUserDao(UserDao userDao) {this.userDao = userDao;}@Autowiredpublic UserService(UserDao userDao) {this.userDao = userDao;}public UserService(@Autowired UserDao userDao) {this.userDao = userDao;}
@Qualifier
@Autowired注解默认是byType进行注入的,也就是说根据类型注入的,如果以上程序中,UserDao接口还有另外一个实现类,会出现问题
/Qualifier 指的是将spring容器中的名字匹配到方法参数中,和方法参数的名称无关
//必须和autowired组合使用byName,根据名称进行装配了。@Autowired注解和@Qualifier注解联合起来才可以根据名称进行装配,在@Qualifier注解中指定Bean名称。
@Autowired() @Qualifier("mysqlDao") //类没有指定别名时 使用类名 首字母小写public void setUserDao( UserDao userDao) {this.userDao = userDao;}
@Resource
- 相当于@Autowired 和 @Qualifier
- @Resource注解默认根据名称装配byName,未指定name时,使用属性名作为name。通过name找不到的话会自动启动通过类型byType装配。
- @Resource注解用在属性上、setter方法上。
- //不指定参数名称时,等同于autowired
@Resource(name = "oracle")
扩展AutoWired
任何方法都可以根据AutoWired注入
// Autowired还可以给普通方法传递参数@Autowired@Qualifier("bbb")public void hahha(UserDao userDao){}@Autowiredpublic void xixixix(List<User> users){}