简介: 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();    }}


原文链接
本文为阿里云原创内容,未经容许不得转载。