spring入门笔记--spring注解

spring原始注解

下面以注解来替换xml中的

改造前:

  <bean id="userDao" class="com.yihao.dao.impl.UserDaoImpl"/>
  <bean id="userService" class="com.yihao.service.impl.UserSeriveImpl">
          <property name="userDao" ref="userDao"/>
  </bean>

改造后:

UserDaoImpl.java

@Component("userDao")  //<bean id="userDao" class="com.yihao.dao.impl.UserDaoImpl"/>
public class UserDaoImpl implements UserDao {
    public UserDaoImpl(){
        System.out.println("UserDaoImpl saving...");
    }
    public void save() {
        System.out.println("saving...");
    }
}

UserSeriveImpl.java

@Component("userService") //<bean id="userService" class="com.yihao.service.impl.UserSeriveImpl">
public class UserSeriveImpl implements UserService {
    @Autowired
    @Qualifier("userDao")    //<property name="userDao" ref="userDao"/> Qualifier注解也可以删掉,默认按数据类型注入。
    private UserDao userDao;
    public void setUserDao(UserDao userDao) {  //注解后set方法可以删掉
        this.userDao = userDao;
    }

    @Override
    public void save() {
        this.userDao.save();
    }
}

applicationContext.xml

  <!--配置组件扫描-->
  <context:component-scan base-package="com.yihao"></context:component-scan>

小结

<bean id="userDao" class=""/> 相当于 @Component("userDao")
<property name="userDao" ref="userDao"/> 相当于@Autowired @Qualifier("userDao")
  1. Repository,component,service,constroller功能是类似的,相互替换也不影响运行。
  2. @Autowired是spring默认按照数据类型从容器中匹配bean的。容器中有多个相同类型的bean,比如数据类型是一个抽象类或接口,有多个子类,这种情况要使用@Qualifier
  3. @Qualifier("userDao")是结合@Autowired使用,按照id值从容器中进行匹配。
  4. @Resource(name="userDao")相当于@Qualifier+@Autowired。
  5. @Value注入普通属性,例如:
  @Value("value")  //@Value("${jdbc.driver}")或者引用容器中的值,更常见。
  private String test;
  1. @scope("singleton")单例或者prototype等
    @PostConstruct
    public void init(){
        System.out.println("初始化成功");
    }
    @PreDestroy
    public void destroy(){
        System.out.println("销毁成功");
    }

对比参考之前的文章Spring入门笔记

spring新注解


通过新注解可以实现全注解开发,不需要xml文件。

xml中配置项 新注解
<context:component-scan base-package="com.yihao"> @ComponentScan("com.yihao")
<import resource=""> @Import({DataSourceConfiguration.class})
<context:property-placeholder location="classpath:jdbc.properties"/> @PropertySource("classpath:jdbc.properties")
<bean id="databaseTest" class=""> @Bean("dataSource")

比如,使用SpringConfiguration作为配置类,替代applicationContext.xml

@Configuration  //标志该类是Spring的核心配置类
//<context:component-scan base-package="com.yihao"></context:component-scan>
@ComponentScan("com.yihao")
//<import resource=""/>
@Import({DataSourceConfiguration.class})
public class SpringConfiguration { }
//<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容器中,即xml中的bean id。
    public DataSource getDataSource(){  //按照驼峰命名,下面测试方法都会默认隐式调用该方法
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driver);
        dataSource.setUrl(url);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        return dataSource;
    }
}

测试时:

//方式一,普通的测试类
@Test
  public void test2() throws SQLException {
  ApplicationContext app = new AnnotationConfigApplicationContext(SpringConfiguration.class);
  UserService service = (UserService)app.getBean("userService");
  service.save();
  //数据库连接
  DruidDataSource dataSource = (DruidDataSource) app.getBean("dataSource");
  Connection connection = dataSource.getConnection();
}

//方式二,使用junit
@RunWith(SpringJUnit4ClassRunner.class)
//@ContextConfiguration("classpath:applicationContext.xml")
@ContextConfiguration(classes = {SpringConfiguration.class})
public class SpringJunitTest {
    @Autowired
    private UserService userService;

    @Autowired
    @Qualifier("dataSource1")
    private DruidDataSource dataSource;

    @Test
    public void test1() throws SQLException {
        userService.save();
        System.out.println(dataSource.getConnection());
    }
}

posted @ 2022-05-15 20:34  Saski&Naruto  阅读(35)  评论(0)    收藏  举报