简介:Spring 注解开发
1. Spring 原始注解
Spring 是轻代码而重配置的框架,配置比拟沉重,影响开发效率,所以注解开发是一种趋势,注解代替 xml 配置文件能够简化配置,进步开发效率。
- Spring 原始注解次要是代替 <Bean> 的配置
- 在这里插入图片形容
留神:
应用注解进行开发时,须要在 applicationContext.xml 中配置组件扫描,作用是指定哪个包及其子包下的 Bean 须要进行扫描以便辨认应用注解配置的类、字段和办法。
<!-- 注解的组件扫描 -->
<context:component-scan base-package="com.xdr630"></context:component-scan>
2. xml 形式配置实现
userDao
public interface UserDao {public void save();
}
userDaoImpl
public class UserDaoImpl implements UserDao {
@Override
public void save() {System.out.println("save running...");
}
}
userService
public interface UserService {public void save();
}
userServiceImpl
public class UserServiceImpl implements UserService {
private UserDao userDao;
public void setUserDao(UserDao userDao) {this.userDao = userDao;}
@Override
public void save() {userDao.save();
}
}
applicationContext.xml
<bean id="userDao" class="com.xdr630.dao.impl.UserDaoImpl"></bean>
<bean id="userService" class="com.xdr630.service.impl.UserServiceImpl">
<property name="userDao" ref="userDao"/>
</bean>
UserController
public class UserController {public static void main(String[] args) {ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = app.getBean(UserService.class);
userService.save();}
}
在这里插入图片形容
3. 注解配置形式实现
在 UserDaoImpl 下的注解,@Component(“userDao”) 来代替 上面 bean 的配置
<bean id="userDao" class="com.xdr630.dao.impl.UserDaoImpl"></bean>
@Component("userDao")
在这里插入图片形容
userServiceImpl 下
<bean id="userService" class="com.xdr630.service.impl.UserServiceImpl">
<property name="userDao" ref="userDao"/>
</bean>
在这里插入图片形容
在 applicationContext.xml 下配置组件要扫描的包
<context:component-scan base-package="com.xdr630"></context:component-scan>
测试:
- xml 配置和注解配置达到雷同的成果
- 应用 @Component 注解不能马上意识到是哪一层,所以 Spring 衍生了三个注解:@Repository、@Service、@Controller,成果和 @Component 成果是一样的,可读性好点。
留神:应用注解形式时,能够省略 set 办法。如:把 userServiceImpl 中的 set 办法删掉,也能胜利运行:
因为把注解放在属性上,间接通过反射为属性赋值,上面的办法也能够应用被赋值的属性了
- 但如果应用 xml 配置的时候 set 办法是不能省略的
把下面的 @Qualifier(“userDao”) 正文掉,也能胜利运行,间接写 - @Autowired 也能注入。因为 @Autowired 是依照数据类型从 Spring 容器中进行匹配的,当 Spring 扫描到这个注解之后,它会间接从 Spring 容器当中找一个 userDao 类型的 bean,找到之后间接注入。如果容器中 UserDao 类型有多个 bean,就不能这样写了。
- 依照类型注入,@Autowired
- 依照名称注入,@Autowired 和 @Qualifier 要一起应用
- @Resources 相当于 @Autowired 和 @Qualifier
@Value 注入一般数据类型,如:把 hello 注入给 driver
- 应用 @Value 进行字符串的注入
- 应用 @Scope 标注 Bean 的范畴
- 应用 @PostConstruct 标注初始化办法,应用 @PreDestroy 标注销毁办法
- 这里没打印销毁的办法起因是:因为容器还没有关闭程序就执行完了,所以造成销毁的办法还没打印进去
- 手动敞开就能够看到销毁的办法打印了
4. Spring 新注解
应用下面的注解还不能全副代替 xml 配置文件,还须要应用注解代替的配置如下:
- 非自定义的 Bean 的配置:<bean>
- 加载 properties 文件的配置:<context:property-placeholder>
- 组件扫描的配置:<context:component-scan>
- 引入其余文件:<import>
- 上面是实现下应用注解齐全代替 xml 文件配置
新建一个外围配置类:SpringConfiguration,相当于总配置
// 标记改类是 Spring 外围配置类
@Configuration
//<context:component-scan base-package="com.xdr630"></context:component-scan>
@ComponentScan("com.xdr630")
//<import resource="xxx"/>
@Import({DataSourceConfiguration.class})
public class SpringConfiguration {}
@Import({DataSourceConfiguration.class}) 外面的值其实是一个数组,能够加载多个类,如:
@Import({DataSourceConfiguration.class,xxx.class})
新建数据源配置类:DataSourceConfiguration,相当于调配置
//<context:property-placeholder location="classpath:jdbc.properties"/>
@PropertySource("classpath:jdbc.properties")
public class DataSourceConfiguration {@Value("${jdbc.driver}")
private String driver;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
@Bean("dataSource") //Spring 会将以后办法的返回值以指定名称存到 Spring 容器当中
public DataSource getDataSource() throws PropertyVetoException {ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setDriverClass(driver);
dataSource.setJdbcUrl(url);
dataSource.setUser(username);
dataSource.setPassword(password);
return dataSource;
}
}
测试加载外围配置类创立 Spring 容器
public class UserController {public static void main(String[] args) {//ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
ApplicationContext app = new AnnotationConfigApplicationContext(SpringConfiguration.class);
UserService userService = app.getBean(UserService.class);
userService.save();}
}
原文链接
本文为阿里云原创内容,未经容许不得转载。