说明
注解在spring就是一个类,使用@+注解名称
在开发中,可以使用注解取代xml配置。更高效快捷。
如果使注解生效要在xml中配置命名空间的声明和扫描信息。
<?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.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="要扫描的包名"></context:component-scan>
</beans>
@Component取代xml中的IOC配置(bean)
还是举个例子比较实在。
一个user类。在类名上添加@Component注解
package com.scx.annot;
import org.springframework.stereotype.Component;
@Component("UsersId")
public class Users
private String username;
private Integer age;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Users [username=" + username + ", age=" + age + "]";
}
}
xml配置 context:component-scan标签,
<context:component-scan base-package="com.scx.annot"></context:component-scan>
扫描当前包。
<?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.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.scx.annot"></context:component-scan>
</beans>
测试代码:
在这里我们为user实例赋初值。
.setUsername("唐嫣");
user.setAge(10);
@org.junit.Test
public void test1() {
String xmlPath = "com/scx/annot/applicationContext.xml";
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
xmlPath);
Users user = applicationContext.getBean("UsersId", Users.class);
user.setUsername("唐嫣");
user.setAge(10);
System.out.println(user);
运行结果:
成功运行出了结果。使用@Component注解实现了和在xml配置bean同样的功能。
@Value取代xml中的字段普通值
我们可以在字段名上添加@value(“普通值”)来取代在xml中
id="" class="">
<property name="" value=""></property>
</bean>
例子:
Users类和上面的一样只不过在字段名上加@Value注解
@Value("唐嫣")
private String username;
@Value("10")
private
测试代码
public void test1() {
String xmlPath = "com/scx/annot/applicationContext.xml";
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
xmlPath);
Users user = applicationContext.getBean("UsersId", Users.class);
System.out.println(user);
}
运行结果
@Autowired取代xml中的字段引用值
使用注解取代字段中的引用值共有三种方式
方式1:按照【类型】注入 @Autowired 自动注入
方式2:按照【名称】注入1
@Autowired
@Qualifier("名称") 根据名称注入
方式3:按照【名称】注入2
@Resource("名称") 根据名称注入
只用方式2举例子了
新建了一个Address类
package com.scx.annot;
import org.springframework.stereotype.Component;
@Component("AddressId")
public class Address
private String phone="110";
private String city="杭州";
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
@Override
public String toString() {
return "Address [phone=" + phone + ", city=" + city + "]";
}
}
在Users类中添加address字段
package com.scx.annot;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component("UsersId")
public class Users
@Value("唐嫣")
private String username;
@Value("10")
private Integer age;
@Autowired
@Qualifier("AddressId")
private Address address;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
@Override
public String toString() {
return "Users [username=" + username + ", age=" + age + ", address="
+ address + "]";
}
}
测试代码不变 输入结果
web注解方式
web开发,提供3个@Component注解衍生注解(功能一样)
@Repository :dao层
@Service:service层
@Controller:web层
这三个注解和@Component一样,在web开发中使用这三个注解是代码更加清晰明了。
下面举个例子
aciton层->service层->dao层
目标例子创建过程
StudentsService接口和其实现类StudentsServiceImpl
StudentsAction,表示web层的action
StudentsDao,表示dao层
代码:
action层 ,里面有一个引用字段studentsService,使用第一种方式注入,和一个方法。调用service层中的doService方法,
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
@Controller("StudentsActionId")
public class StudentsAction {
@Autowired
StudentsService studentsService;
public void execute(){
studentsService.doService();
StudentsService 接口只有一个方法doService
public interface StudentsService {
public void doService();
}
service层:
StudentsService 实现类,一个引用字段stDao ,使用第二种方式注入
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
@Service("StudentsServiceImplId")
public class StudentsServiceImpl implements StudentsService{
@Autowired
@Qualifier("StudentsDaoId")
private StudentsDao stDao;
@Override
public void doService() {
stDao.doDao();
}
}
dao层,只有一个方法 doDao
import org.springframework.stereotype.Repository;
@Repository("StudentsDaoId")
public class StudentsDao {
public void doDao(){
System.out.println("StudentsDao");
}
}
xml配置不变。
测试代码:
执行action的execute方法
@org.junit.Test
public void test() {
String xmlPath = "com/scx/annot/applicationContext.xml";
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
xmlPath);
StudentsAction user = applicationContext.getBean("StudentsActionId", StudentsAction.class);
user.execute();
}
@Scope取代xml中bean的作用域配置
在类名上面添加注解
@Scope(“prototype”) 表示多例
@Scope(“singleton”) 表示单例
很简单 就不再测试了。
生命周期@PostConstruct和@PreDestroy
在方法上添加注解即可。
初始化:@PostConstruct
销毁:@PreDestroy
@PostConstruct表示在生成bean之前调用
@PreDestroy表示销毁bean调用