Spring系统学习--2注解汇总

@Component:

/**
 * 原来在XML的配置
 * <bean id="IAccountService_annotation" class="main.java.service.impl.IAccountService_annotationImpl" >
 *     <property name="iAccountDao_annotation" ref="dao"></property>
 * </bean>
 * 上面原来在XML里面的配置现在可以使用下面的注解搞定:
**/
/** 
@Component:
 *          作用:就相当于在spring的xml配置文件中写了一个bean标签。
 *          属性:
 *              value:用于指定bean的id。当不写时,默认值是当前类名,首字母改小写。例如:accountServiceImpl
 *      由此注解衍生的三个注解:
 *                @Controller:一般用于表现层
 *                @Service:一般用于业务层
 *                @Repository:一般用于持久层
 *                他们的作用以及属性和@Component的作用是一模一样的。他们的出现是spring框架为我们提供更明确的语义化来指定不同层的bean对象。
*/
//@Component(value = "IAccountService_annotation")
//@Service(value = "IAccountService_annotation")
@Repository(value = "IAccountService_annotation")
public class IAccountService_annotationImpl implements IAccountService_annotation {
...
}

@Autowired,@Qualifier, @Resource

/**
        @Autowired
 *           作用:自动按照类型注入。只要容器中有唯一的类型匹配,则可以直接注入成功。如果没有匹配的类型就报错。
 *                如果有多个类型匹配时,会先按照类型找到符合条件的对象,然后再用变量名称作为bean的id,从里面继续查找,如果找到仍然可以注入成功,如果没有匹配的id,就报错
 *           细节:当使用此注解注入时,set方法就可以省略了。
 *           属性:
 *               required:是否必须注入成功。取值是true(默认值)/false。当取值是true时,没有匹配的对象就报错。
 *           @Qualifier作用:在自动按照类型(@Autowired)注入的基础之上,再按照bean的id注入。在给类成员注入时,它不能够浊立使用。
 *           属性:
 *              value:用于指定bean的id。
 *           @Resource作用:直接按照bean的id注入。
 *           属性:
 *              name:用于指定bean的id。
 *          以上3个注解,都只能用于注入其他bean类型,而不能注入基本类型和String。
**/
@Component(value = "IAccountService_annotation")
public class IAccountService_annotationImpl implements IAccountService_annotation {
  //@Autowired
  //@Qualifier(value = "dao")
    @Resource(name = "dao")
    private IAccountDao_annotation iAccountDao_annotation;

 /*   public void setiAccountDao_annotation(IAccountDao_annotation iAccountDao_annotation) {
        this.iAccountDao_annotation = iAccountDao_annotation;
    }*/

    @Override
    public void saveAccount() {
        iAccountDao_annotation.save();
    }
}

@Value:

/**
           @Value作用:用于注入基本类型和String类型的数据。
           属性:
                value:用于指定要注入的数据。它支持使用spring的el表达式。
                spring的el表达式写法:
                                    ${表达式}
**/

@Repository(value = "IAccountService_annotation")
public class IAccountService_annotationImpl implements IAccountService_annotation {
    @Value("https://www.hao123.com/")
    public String url;
    @Value("${jdbc.driver}")
    private String driver;
 @Override
    public void saveAccount() {
        System.out.println(url);//https://www.hao123.com/
        System.out.println(driver);//com.mysql.jdbc.Driver;
        iAccountDao_annotation.save();
    }
}
spring的el表达式的使用前提是:
1.我们要提前创建了相应的配置文件:

 2.我们在spring的xml配置文件里面添加如下注解:

<!--    告知Spring,properties配置文件的位置-->
    <context:property-placeholder location="dataBaseConfig.properties"></context:property-placeholder>

@Scope

/**
       三,用于改变作用范围:
 *      @Scope
 *          作用:用于改变bean的作用范围。范围的取值和xml中的配置是一样的(单例:singleton;多例:prototype)
 *          属性:
 *              value:用于指定范围。
**/
@Component(value = "IAccountService_annotation")
@Scope("prototype")//多例(默认情况是单例)
public class IAccountService_annotationImpl implements IAccountService_annotation {
...
}

测试:

public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("bean_annotation.xml");
        IAccountService_annotation annotation = context.getBean("IAccountService_annotation", IAccountService_annotation.class);
        IAccountService_annotation annotation2 = context.getBean("IAccountService_annotation", IAccountService_annotation.class);
        System.out.println(annotation==annotation2);//false
}

@PostContruct,@PreDestroy

/**
 *      四,和生命周期相关的:
 *          @PostContruct
 *              作用:用于指定初始化方法。和配置文件中init-method属性是一样的
 *          @PreDestroy
 *              作用:用于指定销毁方法。和配置文件中destroy-method属性是一样的
 */
@Component(value = "IAccountService_annotation")
@Scope("singleton")
public class IAccountService_annotationImpl implements IAccountService_annotation {
    @PostConstruct
    public void init(){
        System.out.println("对象初始化了");
    }
    @PreDestroy
    public void destory(){
        System.out.println("对象销毁了");
    }
}

@Configuration

@Configuration//它就相当于表明当前类是spring的配置类,如果只是写到AnnotationConfigApplicationContext构造函数中的字节码,可以不写。//如果是加载要扫描的包时,需要读到此类的配置,同时又没把此类的字节码提供给AnnotafionConfigApplicationContext构造函数,则必须写。
@ComponentScan("com.dao")//指定创建容器时要扫描的包
public class Springconfiguration{
...
}

使用上面注解配置的配置类,我们就不需要spring的xml配置文件了,那么我们怎么获取spring的容器呢?

private ApplicationContext ac=new AnnotationConfigApplicationContext(SpringConfiguration. class);//可以接受多个配置类的class字节码对象

@Import

@ComponentScan("com.all")//指定创建容器时要扫描的包
@Import(JdbcConfig.class)//用于导入其他的配置类
public class Springconfiguration{
...
}

@Bean

/**
*@Bean注解:
*作用:把当前方法的返回值作为bean对象存入spring容器之中。
*属性:
*name:用于指定bean的id。如果没该属性的话,默认值是当前的方法名。

*Spring框架给带有bean注解的方法创建对象时,如果方法有参数,会用方法参数的数据类型前往容器中查找。

*如果能找到唯一的一个类型匹配,则直接给方法的参数注入。

*如果找不到,就报错

*如果找到多个,就需要借助@Qualifier注解,此时它可以独立使用
*/
/**只有一个同类(DataSource )bean对象的情况下
@Bean(name="dbAssit'")
public DBAssit createDBAssit(DataSource dataSource){
return new DBAssit(dataSource);
}
**/
/**多个同类(DataSource )bean对象的情况下**/
@Bean(name="dbAssit")
public DBAssit createDBAssit(@Qualifier("ds1)Datasource dataSource){
return new DBAssit(dataSource);
}
/**
*创建数据源
*/
@Bean(name="ds1")
public DataSource createDataSource1(){
try{
ComboPooledDataSource ds=new ComboPooledDataSource();
ds.setDriverClass("com.mysq1.jdbc.Driver");
ds.set]dbcUr1("jdbc:mysq1://localhost:3306/spring5");
ds.setUser("root");
ds.setPassword("1234");
return ds;
 }catch(Exception e){
throw new RuntimeException(e);
             }
}
@Bean(name="ds2")
public DataSource createDataSource1(){
try{
ComboPooledDataSource ds=new ComboPooledDataSource();
...
return ds;
 }catch(Exception e){
throw new RuntimeException(e);
             }
}

@PropertySource

|@ComponentScan("com.all")//指定创建容器时要扫描的包
@Import(JdbcConfig.class)/用于导入其他的配置类
@PropertySource("classpath:config/jdbcConfig.properties")//配置要添加到spring容器的配置文件的位置
public class Springconfiguration{
}
public class JdbcConfig {
@ Value("${ jdbc. driver}")
private String driver;
@ Value("${ jdbc. url}")
private String url;
@ Value("${ jdbc. username}")
private String username;
@ Value("${jdbc. pas sword}")
private String password;
}

@Transactional

//账户业务层实现类
@Service("accountService")
/**
 * @Transactional可以出现在接口上,类上和方法
 * 接口上:表示该接口中的所有方法,实现类中重写的方法都有事务
 * 类上:表示该类中所有的方法都有事务
 * 方法上:表示当前方法有事务
 * 优先级:就近原则。
 * 方法>类>接口
 */
@Transactional(readOnly = false)
public class AccountServiceImpl implements AccountService {
    @Autowired
    private AccountDao accountDao;

    @Override
    public void transfer(String sourseName, String targetName, Float money) {
        //        根据账户名查询对应的账户
        Account sourceAccount = accountDao.findAccountByName(sourseName);
        Account targetAccount = accountDao.findAccountByName(targetName);
//        转出账户减钱,转入账户加钱
        sourceAccount.setMoney(sourceAccount.getMoney() - money);
        targetAccount.setMoney(targetAccount.getMoney() + money);
//        更新两个账户
        accountDao.updateAccount(sourceAccount);
//        模拟异常
        int i = 1 / 0;
        accountDao.updateAccount(targetAccount);

    }

    @Override
    public Account findAccountById(Integer id) {
        return accountDao.findAccountById(id);
    }
}

@EnableTransactionManagement

开启spring对注解事务的的支持

@Configuration
@EnableTransactionManagement
public class SpringTxConfiguration {
    //里面配置数据源,配置JdbcTemplate,配置事务管理器。在之前的步骤已经写过了。
}

 




posted @ 2020-07-02 23:35  指尖下的世界  阅读(207)  评论(0编辑  收藏  举报
/* 看板娘 */ /*炸泡*/
/* 鼠标点击求赞文字特效 */